基于 DOM 的 XSS 攻击和 InnerHTML
如何保护以下基于 DOM 的 XSS 攻击?
具体来说,是否有一个 protected() 函数可以使以下内容安全? 如果没有,那么还有其他解决方案吗? 例如:给div一个id,然后为元素分配一个onclick处理程序
<?php
function protect()
{
// For non-DOM XSS attacks, hex-encoding all non-alphanumeric characters
// with ASCII values less than 256 works (ie: \xHH)
// But is it possible to augment this function to protect against
// the below DOM based XSS attack?
}
?>
<body>
<div id="mydiv"></div>
<script type="text/javascript">
var xss = "<?php echo protect($_GET["xss"]) ?>";
$("#mydiv").html("<div onclick='myfunc(\""+xss+"\")'></div>")
</script>
</body>
我希望得到一个不是“避免使用innerHTML”或“将xss变量正则表达式为[a-zA-Z0-9]”的答案。 .ie:有更通用的解决方案吗?
谢谢
How would one go about securing the below DOM Based XSS attack?
Specifically, is there a protect() function that will make the below safe?
If no, then is there another solution?
eg: Giving the div an id and then later assigning the element an onclick handler
<?php
function protect()
{
// For non-DOM XSS attacks, hex-encoding all non-alphanumeric characters
// with ASCII values less than 256 works (ie: \xHH)
// But is it possible to augment this function to protect against
// the below DOM based XSS attack?
}
?>
<body>
<div id="mydiv"></div>
<script type="text/javascript">
var xss = "<?php echo protect($_GET["xss"]) ?>";
$("#mydiv").html("<div onclick='myfunc(\""+xss+"\")'></div>")
</script>
</body>
I'm hoping for an answer that is not "avoid using innerHTML" or "regex the xss variable to [a-zA-Z0-9]"...ie: is there a more general solution?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
扩展 Vineet 的回复,这里有一组需要研究的测试用例:
http://ha.ckers.org /xss.html
Expanding on Vineet's reply, here's a set of test-cases to look into:
http://ha.ckers.org/xss.html
我一直在研究 PHP 的 DOMDocument 和相关类,以期编写一个可以处理此类内容的 HTML 解析器。目前它还处于开发的早期阶段,距离实际使用还差得远,但我的早期实验似乎显示了这个想法的一些前景。
基本上,您将标记加载到 DOMDocument 中,然后遍历树。对于树中的每个节点,您可以根据允许的节点类型列表检查节点类型。如果节点类型不在列表中,则会将其从树中删除。
您可以使用与此类似的方法来找到一段标记中的所有 SCRIPT 标记并将其删除。如果您可以从提供的标记中提取任何嵌入的脚本,那么基于 DOM 的 XSS 就会变得毫无用处。
这是我正在使用的代码,以及处理 StackOverflow 主页的测试用例。就像我说的,它距离生产质量代码还很远,只不过是一个概念证明。尽管如此,我还是希望你觉得它有用。
I've been playing around with PHP's DOMDocument and related classes with a view to writing a HTML parser that can deal with stuff like this. It's at a very early stage of development at the moment and is nowhere near ready for actual use, but my early experiments seem to show some promise for the idea.
Basically, you load your Markup into a DOMDocument, then traverse the tree. For each node in the tree you check what the node type is against a list of allowed node types. If the node type isn't in the list then it's removed from the tree.
You could use an approach similar to this to locate all SCRIPT tags in a piece of markup and remove them. DOM based XSS is rendered toothless if you can pull any embedded scripts out of the markup you've been provided.
This is the code I'm using, along with a test case that processes the StackOverflow home page. Like I said, it's far from production quality code and is little more than a proof of concept. Still, I hope you find it useful.
我不是 PHP 专家,但如果您想防止对当前格式的代码示例进行 XSS 攻击,只需进行最少的更改,您可以使用 OWASP ESAPI 的 PHP 版本。具体来说,请使用 ESAPI 中的 JavaScript 编解码器类 保护
xss
变量的内容,因为它出现在 JavaScript 上下文中。I'm no PHP expert, but if you want to prevent XSS attacks against the code sample presented, in the current format, with minimum changes, you could use the PHP edition of OWASP ESAPI. To be specific, use the JavaScript codec class from ESAPI to protect the contents of the
xss
variable, as it appears in a JavaScript context.