2012-03-08 139 views
3

我打算在我的網頁上使用Markdown syntax。我會保持用戶輸入(原始,不轉義或其他)在數據庫中,然後像往常一樣打印出來並與htmlspecialchars()一起飛行。逃離維護Markdown語法的XSS漏洞?

這是怎麼可能看起來:

echo markdown(htmlspecialchars($content));

通過這樣做,我免受XSS漏洞和降價的作品。或者,至少,有點工作。

問題是,比如說,>語法(我認爲還有其他情況)。

總之,引用你做這樣的事情:

> This is my quote.

逃逸和解析,以降價後,我得到這樣的:

> This is my quote.

當然,降價解析器做承認>作爲「報價符號」,它確實不是工作! :(

我來這裏是爲了尋求解決這一問題的一個想法是:。

首先,解析到降價, - 然後用HTML Purifier刪除「壞零件」

你怎麼看呢?難道真的有效麼?

我敢肯定,有人有相同的情況,一來可以幫助我。:)

回答

4

是,某個網站有完全相同的情況。在我寫這篇文章的時候,你在這個網站上有1664的聲望:)

關於堆棧溢出,我們完全按照你描述的(除了我們不能動態呈現)。用戶輸入的Markdown源被轉換爲純HTML,然後使用白名單方法(JavaScript version,C#版本part 1,part 2)對結果進行消毒。

這與HTML Purifier所採用的方法相同(從未使用過,雖然我不能說詳細內容)。

+0

非常感謝! :) [This](http://stackoverflow.com/a/1226814/458610)也對我很有幫助! :) – daGrevis 2012-03-08 20:39:12

1

您使用的方法不安全。例如,考慮這個例子:「[clickme](javascript:alert%28%22xss%22%29)」。一般來說,不要逃避Markdown處理器的輸入。相反,請在安全模式下正確使用Markdown,或將HTML Purifier或其他HTML清理程序應用於Markdown處理器的輸出。

我寫過關於如何安全使用Markdown的elsewhere。有關如何安全使用它的詳細信息,請參閱鏈接,但簡短版本爲:使用最新版本設置safe_mode並設置enable_attributes=False非常重要。

+0

如果你正在談論「enable_attributes = False」和「安全模式」,最新版本的降價。PHP是從一月份開始的,我無法找到這些設置。這只是我或人們在說什麼?我在不同的帖子和那些最近的帖子中遇到過這幾次。 – Richard 2012-08-31 14:29:06

+0

@Richard,請閱讀我答案中的鏈接,您將在其中找到有關如何安全使用Markdown並解答您的問題的詳細信息。 – 2012-08-31 14:36:50