настройка 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");