html () vs innerHTML jQuery / javascript & XSS атаки

я тестирую XSS-атаки на свой собственный код. Ниже приведен пример простого поля, в котором пользователь может вводить все, что захочет. После нажатия кнопки " test!"кнопка, JS покажет входную строку в два divs.Это пример, который я сделал, чтобы лучше объяснить мой вопрос:

<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
    function testIt(){
        var input = document.getElementById('input-test').value;
        var testHtml = document.getElementById('test-html');
        var testInnerHTML = document.getElementById('test-innerHTML');
        $(testHtml).html(input);
        testInnerHTML.innerHTML = input;
    }
</script>
<head>this is a test</head>
<body>  
    <input id="input-test" type="text" name="foo" />
    <input type="button" onClick="testIt();" value="test!"/>
    <div id="test-html">
    </div>
    <div id="test-innerHTML">
    </div>
</body>

если вы попытаетесь скопировать его в a .HTML-файл и запустите его, он будет работать нормально, но при попытке ввода <script>alert('xss')</script>, будет выведено только одно окно предупреждения: одно внутри div 'test-html' (с html() функция.)

Я действительно не могу понять, почему это происходит, а также, проверка кода с firebug дает мне этот результат (после инъекции скрипта)

<body>
this is a test
<input id="input-test" type="text" name="foo">
<input type="button" value="test!" onclick="testIt();">
<div id="test-html"> </div>
<div id="test-innerHTML">
  <script>
    alert('xss')
  </script>
</div>
</body>

как видите,test-html div пуст, и test-innerhtml div contans сценарий. Может кто-нибудь сказать мне, почему? Потому что html () более защищен от инъекций скриптов или чего-то подобного?

заранее спасибо, с наилучшими пожеланиями.

4 ответов


JQuery удаляет теги скрипта, поэтому вы не видите, как он добавляется к dom, не говоря уже о выполнении.

чтобы увидеть объяснение того, почему jquery удаляет его, вы можете увидеть ответ Джона Resig здесь:https://forum.jquery.com/topic/jquery-dommanip-script-tag-will-be-removed

надеюсь, что это помогает


вопреки тому, что говорится на этой странице,jQuery.html() и много функции jQuery которые принимают строки HTML в качестве аргументов более склонны к инъекции XSS на основе DOM, чем innerHTML, как заметил OP.

jQuery.html() извлечение <script> теги, обновляет DOM и оценивает код, встроенный в теги скрипта.

в результате XSS может произойти без взаимодействия с пользователем даже после загрузки DOM, когда используя jQuery.html().

это очень легко продемонстрировать.

этой alert():

$('.xss').html('<script>alert("XSS");</script\>');

http://jsfiddle.net/2TpHC/

пока этого не будет:

var d = document.getElementById('xss');
d.innerHTML = '<script\>alert("XSS");</script\>';

http://jsfiddle.net/Tjspu/

к сожалению, есть много другие пути кода (приемники), которые приводят к вызову eval() в jQuery. Сознание безопасности, вероятно, будет избегать jQuery вообще, насколько это возможно по возможности.

обратите внимание, что я не утверждаю, что использование innerHTML является эффективной защитой от XSS. Это не. Передача неоткрытых данных в innerHTML небезопасна, как указывает @daghan. Надо!--10-->всегда правильно избежать данных при создании HTML.


это похоже на оба этот вопрос и этот. .html() удаляет теги скрипта перед вводом HTML и выполняет их отдельно.

что касается того, почему второй не выполняется, это потому, что динамически добавленные скрипты, подобные этому, не будут запускаться после загрузки страницы.

но, как указывает @Ben, при принятии таких вещей есть много отверстий XSS. Тем не менее, если информация отображаемые на собственной странице, они могут запускать любой произвольный код на своем компьютере. Большой проблемой будет, если вы сохраните это или отправите это другим пользователям. Если вы этого не сделаете, нет никакой защиты пользователей от самих себя в таких отношениях. Возможно, знание того, от чего ты пытаешься защититься, поможет.


да jQuery html не будет отображать теги скриптов

но это не более безопасным потому что вы можете использовать много других полезных нагрузок xss, таких как <a href> стиль , выражение и т. д..