2009-09-18 166 views
3

防止XSS漏洞的最佳做法是什么?避免XSS漏洞 - 白名单?

很多人在这里都提到了白名单,这听起来像个好主意,但我看到很多人使用RegEx定义白名单。这似乎具有内在缺陷,因为它取决于许多因素,其中最少的是RegEx的实现和撰写表达式的人员的技巧不会犯错误。因此,很多XSS攻击成功,因为他们使用techniques to make the regex accept them

什么是最好的(虽然可能比正则表白名单更劳动密集型)的方式来避免这些漏洞/消毒用户输入?完全消毒用户输入在理论上是否可行?

回答

0

过滤XSS的最佳方式取决于您正在开发的平台。正则表达式可以用于防止多种类型的漏洞,但并不总是最好的。防止XSS在PHP的最佳方法是使用htmlspeicalchars();例如:

反射XSS:

print $_GET['xss']; 

修补:

print htmlspecialchars($_GET['xss'],ENT_QUOTES); 

为了验证这一点,我们可以尝试,并执行一些JavaScript http://127.0.0.1/xss.php?xss=<script>alert(/xss/)</script> 在第一个示例中,我们将看到一个弹出式窗口/ xss /。在补丁的例子,它将显示字符串的HTML安全版: <脚本>警报(/ XSS /)< /脚本>

真正的问题是不是<和小于>符号时,如果这些被替换分别使用&lt;&gt;,则您可以安全使用XSS。

+2

这是* false * - >“真正的问题是大于<小于> ...如果这些被替换...那么你是安全的XSS “。除了你认为<意味着*大于*的事实之外,你仍然可以拥有xss恶意并在没有这些字符的情况下被黑客入侵。而且你的代码不会提醒任何事情,你会丢失标签。你也应该对它进行网址编码。 – jspcal 2010-01-22 07:23:09

4

看看AntiXSS库。

+0

该库似乎只有负面评论... – 2013-04-15 07:22:36

2

迈克尔的回答是好的,但它会阻止安全的HTML以及危险的输入。这意味着任何包含HTML格式的输入(例如<em>)都将以实际的HTML代码显示。

如果要接受安全HTML,但块/过滤危险输入,然后用测试和验证的第三方XSS过滤库像HTMLPurifier:http://htmlpurifier.org/

不要推倒重来,尤其是当它涉及到安全。特别是不要将正则表达式用于XSS白名单。