我目前有一個相當健壯的服務器端驗證系統,但我正在尋找一些反饋以確保我已經涵蓋了所有角度。下面是我此刻在做什麼簡要概述:全面的服務器端驗證
確保輸入不爲空,或者是過長
逃生查詢字符串以防止SQL注入
使用正則表達式來拒絕無效字符(這取決於提交的內容)
對某些html標記進行編碼,如<腳本>(所有標記均已編碼當存儲在數據庫中時,在查詢要在頁面中呈現時解碼一些)
有什麼我失蹤了嗎?代碼示例或正則表達式歡迎。
我目前有一個相當健壯的服務器端驗證系統,但我正在尋找一些反饋以確保我已經涵蓋了所有角度。下面是我此刻在做什麼簡要概述:全面的服務器端驗證
確保輸入不爲空,或者是過長
逃生查詢字符串以防止SQL注入
使用正則表達式來拒絕無效字符(這取決於提交的內容)
對某些html標記進行編碼,如<腳本>(所有標記均已編碼當存儲在數據庫中時,在查詢要在頁面中呈現時解碼一些)
有什麼我失蹤了嗎?代碼示例或正則表達式歡迎。
您應該不需要「轉義」查詢字符串以防止SQL注入 - 您應該使用預處理語句。
理想情況下,您的輸入過濾將在任何其他處理之前發生,所以您知道它將始終使用。因爲否則你只需要錯過一個地方容易出現問題。
不要忘記在輸出上編碼HTML實體 - 以防止XSS攻擊。
您應該對每個html標籤進行編碼,而不僅僅是'無效'標籤。這是一個熱門的爭論,但基本上總結一下,總會有一些無效的HTML組合,你會忘記正確處理(嵌套標籤,某些瀏覽器不正確地解釋'標籤'等)。因此,我認爲最安全的選擇是將所有內容都存儲爲htmlentities,然後在輸出時從內容中打印經過驗證的HTML安全子集樹(作爲實體)。
所有標籤在存儲在數據庫中時都進行編碼,但我希望某些標籤在頁面中進行渲染,以便在查詢時對這些標籤進行解碼,但有些類似於腳本標籤。我已經修改了這個問題來反映這一點。 – conmulligan 2008-09-28 22:11:51
在專用於該任務的庫中運行所有服務器端驗證,以便改進一個區域會影響您的所有應用程序。
此外還包括針對已知攻擊的工作,例如目錄遍歷和嘗試訪問shell。
這個問題/答案有你要找的
(PHP爲導向,但隨後又沒有指定語言/平臺和它的一些應用超越了PHP世界)一些很好的迴應:
您可以爲數據過濾檢查出Filter Extension。它並不能保證你完全密封,但個人感覺使用它更好,因爲代碼有很多眼球看着它。
另外,考慮準備聲明借調。在SQL查詢中轉義數據已成爲過去。
關於第三點,我會改變說「使用正則表達式只接受有效字符。」也就是說,請指定您接受的內容,而不是嘗試去考慮可能會拒絕的所有不良內容。 – bmb 2008-09-29 00:19:08