2008-09-28 55 views
3

我目前有一個相當健壯的服務器端驗證系統,但我正在尋找一些反饋以確保我已經涵蓋了所有角度。下面是我此刻在做什麼簡要概述:全面的服務器端驗證

  • 確保輸入不爲空,或者是過長

  • 逃生查詢字符串以防止SQL注入

  • 使用正則表達式來拒絕無效字符(這取決於提交的內容)

  • 對某些html標記進行編碼,如<腳本>(所有標記均已編碼當存儲在數據庫中時,在查詢要在頁面中呈現時解碼一些)

有什麼我失蹤了嗎?代碼示例或正則表達式歡迎。

+0

關於第三點,我會改變說「使用正則表達式只接受有效字符。」也就是說,請指定您接受的內容,而不是嘗試去考慮可能會拒絕的所有不良內容。 – bmb 2008-09-29 00:19:08

回答

8

您應該不需要「轉義」查詢字符串以防止SQL注入 - 您應該使用預處理語句。

理想情況下,您的輸入過濾將在任何其他處理之前發生,所以您知道它將始終使用。因爲否則你只需要錯過一個地方容易出現問題。

不要忘記在輸出上編碼HTML實體 - 以防止XSS攻擊。

2

您應該對每個html標籤進行編碼,而不僅僅是'無效'標籤。這是一個熱門的爭論,但基本上總結一下,總會有一些無效的HTML組合,你會忘記正確處理(嵌套標籤,某些瀏覽器不正確地解釋'標籤'等)。因此,我認爲最安全的選擇是將所有內容都存儲爲htmlentities,然後在輸出時從內容中打印經過驗證的HTML安全子集樹(作爲實體)。

+0

所有標籤在存儲在數據庫中時都進行編碼,但我希望某些標籤在頁面中進行渲染,以便在查詢時對這些標籤進行解碼,但有些類似於腳本標籤。我已經修改了這個問題來反映這一點。 – conmulligan 2008-09-28 22:11:51

1

在專用於該任務的庫中運行所有服務器端驗證,以便改進一個區域會影響您的所有應用程序。

此外還包括針對已知攻擊的工作,例如目錄遍歷和嘗試訪問shell。

1

您可以爲數據過濾檢查出Filter Extension。它並不能保證你完全密封,但個人感覺使用它更好,因爲代碼有很多眼球看着它。

另外,考慮準備聲明借調。在SQL查詢中轉義數據已成爲過去。