我正在对我自己的代码测试 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>
,只会抛出一个警告框:“test-html”div 内的警告框(带有 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() 对于脚本注入或类似的东西更安全吗?
预先感谢,最诚挚的问候。
与已接受的答案中所说的相反,jQuery.html()
和许多jQuery 函数接受 HTML 字符串作为参数更容易受到基于 DOM 的 XSS 注入innerHTML
,正如OP所注意到的。
jQuery.html()
提取出<script>
标签,更新 DOM 和评估嵌入在脚本标签中的代码.
因此,即使在使用时加载 DOM 之后,在没有用户交互的情况下,XSS 也可能发生jQuery.html()
.
这很容易演示。
这将调用alert()
:
$('.xss').html('<script>alert("XSS");</script\>');
http://jsfiddle.net/2TpHC/ http://jsfiddle.net/2TpHC/
虽然这不会:
var d = document.getElementById('xss');
d.innerHTML = '<script\>alert("XSS");</script\>';
http://jsfiddle.net/Tjspu/ http://jsfiddle.net/Tjspu/
不幸的是,有many导致调用的其他代码路径(接收器)eval()
在 jQuery 中。具有安全意识的人可能会尽可能完全避免使用 jQuery。
请注意,我并不声称使用innerHTML 可以有效防御XSS。它不是。正如@daghan 所指出的,将未转义的数据传递给innerHTML 并不安全。一应该always生成 HTML 时正确转义数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)