настройка innerHTML со скриптом внутри
Если я запускаю следующую строку в Firebug на любой странице:
document.documentElement.innerHTML="<script>alert(1)</script>";
почему alert
команда выполняется?
4 ответов
похоже, что ваш <script>
tag is добавляется, как вы ожидаете, но код внутри него не выполняется. Тот же сбой происходит, если вы пытаетесь использовать document.head
(или любой другой элемент DOM, кажется). По какой-либо причине (возможно, соответствие стандартам, возможная безопасность), встроенный код внутри <script>
блоки, которые добавляются через .innerHTML
просто не работает.
однако, у меня есть рабочий код, который создает похожие функциональность:
var script = document.createElement('script');
script[(script.innerText===undefined?"textContent":"innerText")] = 'alert(1);';
document.documentElement.appendChild(script);
здесь вы добавляете <script>
блок documentElement.appendChild
и использовать textContent
или innerText
установить контент <script>
.
на самом деле вы можете использовать eval
но это не очень хорошая практика для проблем безопасности. Вы можете сделать что-то вроде этого:
var scr = document.createElement('script');
scr.src = 'yourscriptsource';
document.body.appendChild(scr);
надеюсь, что это помогает!
всегда лучше использовать создание элементов и добавление их, а не прямую вставку любого html с помощью innerhtml.
вы можете использовать подробнее об этом здесь:https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet
этот фрагмент работает:
var newScript = document.createElement( "script" );
newScript.type = 'text/javascript';
var scriptContent = document.createTextNode( "googletag.cmd.push( function() { googletag.display( '" + encodeURIComponent( divID ) + "' ); } );" );
newScript.appendChild( scriptContent );
вот пример в действии: https://jsfiddle.net/BrianLayman/4nu667c9/
вы не должны этого делать. В Firebug перейдите на вкладку "консоль". Вы можете ввести код прямо там. Рядом с тремя синими угловыми скобками в нижней части консоли введите это, а затем нажмите клавишу enter:alert("asdf");