我一直对编写像论坛或博客这样的网络软件很感兴趣,这些东西需要有限的标记才能重写为 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 保护的原则和最佳实践以及一般建议。