Web 應用程式安全指南/(非)可信輸入
外觀
所有使用者輸入都應視為不可信。看似“可信/安全”的輸入,比如PHP中的一些$_SERVER變數,很容易被攻擊者操控。
為了防止此類攻擊
- 徹底過濾/轉義任何不可信內容
- 如果某些輸入欄位允許的字元集有限,請在使用之前檢查輸入是否有效
- 如果對某些型別的資料(例如伺服器變數)存在疑問,請將其視為不可信
- 如果您確定,但實際上並不需要將其視為可信,請將其視為不可信
- 請求URL(例如在環境變數中)不可信
- 來自HTTP頭的資料不可信
- Referer
- X-Forwarded-For
- Cookies
- 伺服器名稱(!)
- 所有POST和GET資料都不可信
- 包括非使用者可修改的輸入欄位,如select
- 所有內容驗證都應在伺服器端進行
基本原理
轉義或過濾不應該包含任何需要轉義的字元的“可信”輸入只會帶來微不足道的效能損失,但如果輸入被證明不可信,你將處於安全的一方。
使用字元白名單驗證輸入資料可以避免使用意外字元(空位元組、UTF-8、內部表示中用作分隔符的控制字元等)進行的攻擊。確保您的驗證不要過於嚴格,例如,您需要在人名欄位中允許UTF-8和'之類的字元。
攻擊者不受瀏覽器對其施加的約束。即使輸入欄位被指定為maxlength=20,也不意味著攻擊者不能建立包含200KB資料的請求。對於任何基於JavaScript的約束也是如此。