【发布时间】:2009-04-09 14:58:54
【问题描述】:
我一直对编写像论坛或博客这样的网络软件很感兴趣,这些东西需要有限的标记才能重写为 HTML。但是最近,我越来越多地注意到对于 PHP,尝试在谷歌上搜索“PHP BBCode parser -PEAR”并测试一些,你要么效率低下,要么代码很差,到处都是 XSS 漏洞。
以我之前提到的例子,那些糟糕的 BBCode 解析器,你将如何避免 XSS?我现在将使用您处理链接的典型正则表达式,您可以提及它的脆弱性以及如何避免它。
// Assume input has already been encoded by htmlspecialchars with ENT_QUOTES
$text = preg_replace('#\[url\](.*?)\[/url\]#i','<a href="\1">\1</a>', $text);
$text = preg_replace('#\[url=(.*?)\](.*?)\[/url\]#i','<a href="\1">\2</a>', $text);
处理图像标签几乎没有比这更安全的了。
所以我有几个具体问题,主要针对 PHP 实现。
- 在此示例中,仅使用 uri/url 验证表达式进行匹配是否更好?或者,最好使用
(.*?)和回调,然后确定输入是否是有效链接?正如上面显而易见的,javascript:alert('XSS!')可以在上面的 URL 标记中工作,但如果完成 uri 匹配,则会失败。 - 回调中的
urlencode()之类的函数呢,它们会是什么威慑或问题(就 URI 标准而言)? - 编写全栈解析器会更安全吗?或者,开发和使用这样的东西所需的时间和处理能力对于每页处理多个不同条目的东西来说是否过于繁重?
我知道我的示例是众多示例之一,并且比某些示例更具体。但是,不要逃避提供自己的。 因此,我正在寻找在文本解析情况下 XSS 保护的原则和最佳实践以及一般建议。
【问题讨论】:
标签: regex xss markup text-parsing bbcode