2015-09-02 38 views
1

我想讓我的網站安全地抵禦XSS攻擊。插入到數據庫之前的時間點

我有一個模塊,它允許用戶插入文本(特殊字符)到數據庫中。該文本顯示在起始頁面上。

現在我的問題:我應該插入userinput進入數據庫之前使用htmlentities($_POST["userinput"], ENT_QUOTES, 'UTF-8')

或者,我可以直接將userinput到數據庫中,只是htmlentities顯示呢?

+0

你不應該操縱原始數據。處理數據時處理數據會更好,例如在屏幕上顯示或進行計算時。 – LaVomit

+0

該腳本只是將userinput插入到數據庫中。在另一個網站上,此用戶輸入將顯示 - >不工作。所以在輸出上的安全性是安全的? – Bernd

+0

我完全不知道您的計劃,但無論您使用什麼數據,您都應該始終追蹤原始數據。所以我建議你在顯示它時使用'htmlentities'。還要確保這裏的所有內容都是UTF-8,也是數據庫中的存儲,否則特殊字符可能不清楚。這可以通過使用'utf8_encode'和/或'utf8_decode'來解決,但顯然最好確保所有設置都正確。 – LaVomit

回答

4

有些人認爲你應該對輸入輸出消毒XSS。我認爲這不是很有價值。首先,它只是真的很重要,因爲這是你試圖緩解的漏洞存在的地方。我認爲任何依靠將來自數據庫的東西視爲可信任輸入的解決方案都會被打破。

問題是向下行的地方,你(或之後誰上臺的人)可能決定他們需要以不同的插入數據 - 一些外部API - 誰知道。問題是,現在你的頁面存在一個安全漏洞,因爲你決定信任來自數據庫的數據。

反對爲我的方式做這件事的方式的說法是兩個部分:

  1. 您不添加任何額外的安全性,所以你真的只讓人們感覺喜歡它是安全的兩倍 - 這不是我們想要創造的感覺。我們想要證明某件事情是安全的,不僅僅是讓它感覺到安全。double安全。

  2. 你也可能會寫一個錯誤,將原始數據擰緊。如果在渲染時發生這種情況,這並不是什麼大事,因爲您可以修復它並正確顯示它。如果它在您存儲時發生,那麼這些數據是無法恢復的。

+0

我有UTF-8的問題。當我將htmlentities-data插入數據庫時​​,我得到了數據庫中特殊字符的代碼。如果我嘗試輸出它們,我又會得到這些代碼。我不想用特殊字符替換每個代碼,但我認爲這就是我如何做到這一點,如果我想「它是安全的兩倍」 – Bernd

+0

我認爲你可以在插入時不編碼數據,而是隻有當你顯示它時才做。這是我想表達的想法。 – Gray

相關問題