2011-09-02 69 views
6

這已被問過,但我需要在這個問題上100%清晰,因爲這對我來說是非常重要的。PHP XSS問題/澄清

情況:網站上的消息系統。用戶在文本框中輸入消息,他們提交表單並將其輸入到數據庫中。然後可以從數據庫中調用這些數據,並將<span>標籤顯示給其他用戶。

我需要採取哪些安全措施來防止數據惡意?我已經使用mysql_real_escape_string來停止任何注入和strip_tags似乎很有用,但我聽說過很多其他的名字。考慮到它僅在<span>標籤中顯示,我需要使用什麼來保護這些數據?

謝謝。

+0

可能重複[PHP:如何完全防止XSS攻擊?](http://stackoverflow.com/questions/5934063/php-how-to-totally-prevent-xss-attacks) –

+0

只是爲了澄清,我這是一個重複的標記,不是因爲這是一個糟糕的問題(不是!) - 每個人都應該這麼努力 –

+0

這裏的底線是總是消毒任何用戶提供的數據,不管它有多麼微不足道。 – Jrod

回答

3

誤解是您要跳過輸入,這是錯誤的。您必須過濾輸出(並且數據庫也是輸出)。

這意味着當提交表單時,您使用mysql_real_escape_string()將數據發送(輸出)到數據庫,並且您使用htmlspecialchars()在屏幕上輸出內容。正則表達式適用於正則表達式,您將使用preg_quote(),依此類推。

無論數據來自何處,您都必須在發送到的位置的上下文中將其轉移。

因此,爲了防止XSS攻擊,您必須使用htmlspecialchars()/htmlentities()mysql_real_escape_string與XSS無關(但在將數據發送到數據庫時仍然需要使用它)。

+0

我知道mysql_real_escape_string是有點不相關的這個話題,但我提到它,以避免任何人說:「你也必須這樣做!」 :)當你在htmlspecialchars和htmlentities之間加了一個斜線時,你是說使用兩者還是使用其中一個?哪個更好?另外,preg_quote()是什麼?當你在正則表達式中使用它的時候,我並不是100%確定你的意思(即使我使用了定義!:D) – James

+2

James,他提到'preg_quote',因爲»使用(適用於html的htmlspecialchars,適用於mysql dbs的mysqli_real_escape_string,適用於任何數據庫的準備好的語句,用於perl兼容的正則表達式的preg_quote,使用escapeshellarg的適用於推薦的函數)用於shell命令的escapeshellcmd等)用於區分輸入和輸出的+1 – knittl

+0

。如果它不是HTML,不要驗證/過濾它(使用'strip_tags()')。 –

3

在HTML頁面上輸出時使用htmlspecialchars。它將以與用戶輸入相同的方式顯示數據(因此用戶可以在其消息中使用類似<3的東西,而不會剝離其餘部分)

+0

,這僅僅可以防止所有類型的XSS,考慮到我只將內容放在''標籤內而不是在html對象內部?我確定我在其他地方看過,有人說這是舊的和無用的? – James

+0

@James:如果你的系統可用,'htmlentities'是一個更好的選擇,但它們都能正常工作。 –

+0

James,在''內輸出文本時,這是完全安全的。這是不老,無用,建議。 ['htmlspecialchars'](http://php.net/htmlspecialchars)用於輸出和[準備語句](http://php.net/mysqli_prepare)/ ['mysqli_real_escape_string'](http://php.net/mysqli_real_escape_string ) – knittl

0

請檢查OWASP XSS預防備忘單。它將解釋如何避免不同情況下的XSS。在標籤之間,應該做好這項工作。