Я тестирую xss-атаки на свой собственный код. Пример ниже представляет собой простое поле, в котором пользователь может вводить все, что он хочет. После нажатия "проверить!" Кнопка JS покажет входную строку в два div.Это пример, который я сделал, чтобы лучше объяснить мой вопрос:
<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>
если вы попытаетесь скопировать его в файл .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 содержит скрипт. Может кто-нибудь сказать мне, почему? Это потому, что html () более защищен от внедрения скриптов или чего-то подобного?
Заранее спасибо, с наилучшими пожеланиями.