2013-02-19 127 views
0

我需要儘可能以集中的方式防止XSS攻擊,這樣我就不必顯式清理每個輸入。消毒用戶輸入的最佳方式是什麼?

我的問題是在URL /請求處理級別消毒所有輸入,在服務之前對輸入進行編碼/消毒,還是在顯示級別(輸出消毒)都更好? 哪一個更好?爲什麼?

+4

僅在必要時進行消毒:請勿在此之前進行此項工作。 (例如,不要將保存在數據庫中的htmlspecialchars中傳遞的值)僅在需要打印輸出時才執行此操作。 [Twig](http://twig.sensiolabs.org/)已自動轉義,您不必擔心應用程序的這一方面。 – Federkun 2013-02-19 08:54:47

+0

謝謝,但爲什麼不呢?在將數據插入數據庫之前已經清理數據的問題是什麼?我試圖集中它來減少工作量。 – 2013-02-19 09:22:27

+0

可能的重複[在PHP網站中避免xss攻擊的最佳實踐](http://stackoverflow.com/questions/71328/what-are-the-best-practices-for-avoiding-xss-attacks- in-a-php-site) – Quentin 2013-02-19 09:26:13

回答

2

有,你需要注意兩個方面:

  1. 任何地方,你在任何語言中,最值得注意的是,包括SQL中使用輸入作爲腳本的一部分。在SQL的特殊情況下,只有推薦的處理事情的方式是使用參數化查詢(這會導致非轉義內容在數據庫中,但正如字符串:這很理想)。在將字符直接替換爲SQL字符串之前,任何涉及字符的神奇引用都是次要的(因爲它很容易出錯)。任何無法通過參數化查詢完成的事情都是針對SQL注入的服務應該永遠不允許用戶指定。

  2. 任何地方,您呈現的內容都是輸入的內容。輸入源可以是直接的(包括通過cookie)或間接的(通過數據庫或文件)。在這種情況下,您的默認方法應該是將用戶看到的文本作爲輸入的文本。這很容易正確實現,因爲您實際上只需引用的字符是<&,並且您可以將其全部包裝在<pre>中進行顯示。

但這通常是不夠的。例如,您可能想要允許用戶進行某種格式化。這是它容易出錯的地方。在這種情況下最簡單的方法是解析輸入並檢測所有格式化指令;一切都需要正確引用。您應該將格式化版本額外存儲在數據庫中作爲額外的列,以便在將其返回給用戶時不需要做太多工作,但是您還應該存儲用戶輸入的原始版本,以便您可以搜索它。 不要混淆!真的!審覈您的應用程序,使完全確保您得到這個權利(或者,更好的是讓別人來做審計)。

但是,關於使用SQL小心的一切仍然適用,並且有許多永遠不會安全的HTML標記(例如,<script><object>)和屬性(例如,onclick)。


您正在尋找有關特定包做的工作的建議?你真的需要選擇一種語言。上述建議完全與語言無關。附加軟件包/庫可以使上述許多步驟在實踐中變得非常簡單,但您仍然需要小心。

+0

非常感謝您的答覆,它正是我所需要的,實際上我從來沒有打算將它作爲一個語言特定的問題,因爲它的價值在於使用TCL作爲實現語言。 – 2013-02-19 09:49:46

相關問題