我打算在我的网页中使用Markdown syntax。我会在数据库中保留用户输入(原始,没有转义或其他),然后像往常一样打印出来并使用htmlspecialchars()即时逃脱。
它的外观如下:
echo markdown(htmlspecialchars($content));
通过这样做,我可以防止XSS漏洞和Markdown工作。或者,至少,有点工作。
问题是,假设>
语法(我认为还有其他情况)。
简而言之,引用你做的事情是这样的:
> This is my quote.
转义并解析为Markdown之后我得到了这个:
> This is my quote.
当然,Markdown解析器不将>
识别为“引用符号”,并且不工作! :(
我来这里是为了解决这个问题。一个想法是:
首先,解析Markdown,然后用HTML Purifier删除“坏部分”。
你怎么看?它真的有效吗?
我确信有人有同样的情况,也可以帮助我。 :)
答案 0 :(得分:4)
是的,某个网站的情况完全相同。在我写这篇文章的时候,你在该网站上有1664的声誉:)
在Stack Overflow上,我们完全按照您的描述进行操作(除了我们不动态渲染)。用户输入的Markdown源将转换为纯HTML,然后使用白名单方法(JavaScript version,C#版本part 1,part 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
非常重要。