2012-07-21 26 views
4

我正在開發一個允許公衆(所有人)通過TinyMCE爲他們自己的項目頁面插入HTML的項目。由於每個人都可以使用此功能,因此我需要100%安全的方式將TinyMCE輸出插入到我的數據庫中,並將其顯示在另一頁上,就像用戶插入的一樣。在MySQL中存儲html的100%安全方式

XSS,SQL注入和所有其他廢話不是我想要在我的新網站!我可以做htmlentities - > htmlspecialchars和稍後使用htmlentities_decode,但這是100%安全的,這是做到這一點的最佳方式?

+1

允許用戶編寫原始HTML然後顯示給其他用戶實際上是乞求利用。避免SQL注入是微不足道的;只使用準備好的語句。在這種情況下避免XSS是棘手的(不可能?)。 – 2012-07-21 11:30:23

+4

http://htmlpurifier.org/ - HTMLPurifier – Gntem 2012-07-21 11:31:07

+0

我同意@OliCharlesworth,在你的情況下幾乎不可能阻止XSS。 – Adi 2012-07-21 11:33:23

回答

6

SQL注入在大多數情況下使用預準備語句很容易避免。

如果您計劃允許用戶發佈HTML標記,則XSS會更加困難。您需要刪除所有<script>標記,來自標記的所有on*屬性,所有javascript:網址,甚至可能無法完全保證輸入HTML安全。有諸如HTMLPurifier這樣的庫可以提供幫助,但只要您允許使用HTML,就有可能讓惡意通過。

您可以使用實現諸如markdown或wikitext之類的庫來代替。這嚴重限制了用戶可以輸入的內容,同時仍然允許他們在一定程度上標記內容。它並不是完全防護的(人們仍然可以將鏈接發佈到惡意網站,並希望用戶點擊它們,有些人實際上已經足夠天真),並且您將無法使用豐富的編輯器,如TinyMCE,而無需進行某種排序的插件,但它是一個簡單的工作來消毒降價比消毒HTML。

-3

存儲和顯示HTML是兩件不同的事情。

對於存儲在MySQL中的HTML,mysql_real_escape_string()就足夠了,並且會保護你免受SQL注入。

對於顯示,這取決於。您希望用戶能夠編寫HTML,但您希望受到XSS攻擊等保護,因此您應該使用像HTMLPurifier這樣的過濾器(這就是Stackoverflow所做的)。您只需從數據庫中檢索HTML後執行此操作。

您永遠不需要使用htmlentities()htmlentities_decode()

+0

,因此您存儲了一個內容,然後過濾?爲什麼不過濾然後存儲.. – Gntem 2012-07-21 11:32:48

+2

因爲如果用戶想要稍後編輯它們的HTML,則不希望它們向他們顯示處理過的文本。你可以通過在MySQL中使用兩列來避開這種情況,一個用於原始HTML,一個用於過濾的HTML。但我認爲這超出了這個問題的範圍。 – Artefact2 2012-07-21 11:33:55

+0

「這就是StackOverflow所做的事情」 - 但是StackOverflow不會呈現任意的HTML ... – 2012-07-21 11:33:58

3

這是不可行的。你認爲要過濾這是一個很好的觀點,但最終如果你接受HTML,它將不可能完全鎖定它。看看像bbcode,降價等東西,看看一些替代品。

如果您決定接受HTML代碼,它不僅僅是過濾需要完成的事情,即使編碼也會產生嚴重的安全問題。例如,搜索UTF-7以查看哪些類型的問題。在這裏看到一些示例:http://www.webappsec.org/projects/articles/091007.txt

+0

它確實可行,只需使用帶有安全白名單的HTML過濾器即可。我有點驚訝,唯一有回報的答案並沒有真正回答這個問題。 – Artefact2 2012-07-21 11:38:19

+0

即使使用白名單,也可以使用智能技巧生成標籤。還要考慮編碼等。即使是類似的非常知名的HTML淨化器,在角落案例中也存在安全問題。這聽起來不錯,但它太難以考慮它的安全。由於可能存在的選項數量很多,很多角落案件都應該被覆蓋。不可能監督所有選項,所以這就是爲什麼它是一個安全問題。 – 2012-07-21 11:42:10

相關問題