我已经知道XSS是如何工作的,但是找出所有注入恶意输入的方法并不是一种选择。
我在那里看到了几个库,但大多数都是非常不完整,无效或GPL许可(你们什么时候才能知道GPL不适合分享小库!使用麻省理工学院)
答案 0 :(得分:17)
OWASP提供了一个编码库,用于处理各种情况。
已过时:http://www.owasp.org/index.php/Category:OWASP_Encoding_Project
现在是http://code.google.com/p/reform/
和OWASP的antiXSS特定库位于:http://code.google.com/p/php-antixss/
答案 1 :(得分:7)
htmlspecialchars()
是您应该了解的唯一功能。
答案 2 :(得分:4)
HTMLPurifier是清理HTML输入的唯一最佳选择,htmlspecialchars应该应用于其他任何内容。
但是XSS漏洞不应该清理,因为任何此类提交都是垃圾。而是让您的应用程序保释并写入日志条目。实现XSS检测的最佳过滤器集在mod_security core rules。
我在new input()中使用了一个不可思议但非常彻底的属性检测,请参阅_xss方法。
答案 3 :(得分:3)
修改:感谢@mario指出一切都取决于上下文。确实没有超级方式可以在所有情况下全部阻止它。你必须相应调整。
编辑我对@bobince和@ Rook在此问题上的支持表示反对并非常感谢。我现在非常清楚 strip_tags
不会以任何方式阻止XSS攻击。
我在回答之前已经扫描了所有代码,看看我是否以任何方式曝光,并且由于htmlentities($a, ENT_QUOTES)
我一直主要用来应对W3C而一切都很好。
那说我已经更新了下面的功能,有点模仿我使用的功能。我仍然发现h strip_tags
在htmlentities之前很高兴,所以当用户尝试输入标签时,他们不会污染最终结果。假设用户输入了<b>ok!</b>
,将其显示为ok!
比打印出已转换的全文文本更好。
非常感谢您花时间回复并解释。
如果它来自互联网用户:
// the text should not carry tags in the first place
function clean_up($text) {
return htmlentities(strip_tags($text), ENT_QUOTES, 'UTF-8');
}
如果它来自后台......不要。
公司的某些人可能需要为此页面或该页面使用javascript,这是完全正确的理由。能够记录和责备比关闭你的更好。
答案 4 :(得分:1)
我很喜欢htmlpurifier,但我知道它效率低,因为它相当大。此外,它是LGPL,我不知道这是否属于你的GPL禁令。
答案 5 :(得分:1)
除了zerkms's answer之外,如果您发现需要接受用户提交的HTML(例如,来自WYSIWYG编辑器),您将需要使用HTML解析器来确定哪些可以提交,哪些不能提交
我使用并推荐HTML Purifier。
注意:甚至尝试使用正则表达式:)
答案 6 :(得分:0)
我很惊讶这里没有提到,但我更喜欢htmlAwed到htmlPurifier。它是最新的,很好的许可,非常小,非常快。