逃避XSS漏洞维护Markdown语法?

时间:2012-03-08 11:25:05

标签: php escaping xss markdown markup

我打算在我的网页中使用Markdown syntax。我会在数据库中保留用户输入(原始,没有转义或其他),然后像往常一样打印出来并使用htmlspecialchars()即时逃脱。

它的外观如下:

echo markdown(htmlspecialchars($content));

通过这样做,我可以防止XSS漏洞和Markdown工作。或者,至少,有点工作。

问题是,假设>语法(我认为还有其他情况)。

简而言之,引用你做的事情是这样的:

> This is my quote.

转义并解析为Markdown之后我得到了这个:

> This is my quote.

当然,Markdown解析器>识别为“引用符号”,并且工作! :(

我来这里是为了解决这个问题。一个想法是:

首先,解析Markdown,然后用HTML Purifier删除“坏部分”。

你怎么看?它真的有效吗?

我确信有人有同样的情况,也可以帮助我。 :)

2 个答案:

答案 0 :(得分:4)

是的,某个网站的情况完全相同。在我写这篇文章的时候,你在该网站上有1664的声誉:)

在Stack Overflow上,我们完全按照您的描述进行操作(除了我们不动态渲染)。用户输入的Markdown源将转换为纯HTML,然后使用白名单方法(JavaScript version,C#版本part 1part 2)对结果进行清理。

这与HTML Purifier采用的方法相同(从未使用过,但我不能说明细节)。

答案 1 :(得分:1)

您使用的方法并不安全。例如,考虑这个例子:“[clickme](javascript:alert%28%22xss%22%29)”。通常,不要转义Markdown处理器的输入。相反,在安全模式下正确使用Markdown,或将HTML Purifier或其他HTML清理程序应用于Markdown处理器的输出。

我已经写过关于如何安全使用Markdown的elsewhere。有关如何安全使用它的详细信息,请参阅链接,但简短版本是:使用最新版本,设置safe_mode和设置enable_attributes=False非常重要。