跳至內容

Web 應用程式安全指南/(非)可信輸入

來自華夏公益教科書,開放書籍,開放世界

(Un)trusted input

所有使用者輸入都應視為不可信。看似“可信/安全”的輸入,比如PHP中的一些$_SERVER變數,很容易被攻擊者操控。

為了防止此類攻擊

  • 徹底過濾/轉義任何不可信內容
  • 如果某些輸入欄位允許的字元集有限,請在使用之前檢查輸入是否有效
  • 如果對某些型別的資料(例如伺服器變數)存在疑問,請將其視為不可信
  • 如果您確定,但實際上並不需要將其視為可信,請將其視為不可信
  • 請求URL(例如在環境變數中)不可信
  • 來自HTTP頭的資料不可信
    • Referer
    • X-Forwarded-For
    • Cookies
    • 伺服器名稱(!)
  • 所有POST和GET資料都不可信
    • 包括非使用者可修改的輸入欄位,如select
  • 所有內容驗證都應在伺服器端進行

基本原理

轉義或過濾不應該包含任何需要轉義的字元的“可信”輸入只會帶來微不足道的效能損失,但如果輸入被證明不可信,你將處於安全的一方。

使用字元白名單驗證輸入資料可以避免使用意外字元(空位元組、UTF-8、內部表示中用作分隔符的控制字元等)進行的攻擊。確保您的驗證不要過於嚴格,例如,您需要在人名欄位中允許UTF-8和'之類的字元。

攻擊者不受瀏覽器對其施加的約束。即使輸入欄位被指定為maxlength=20,也不意味著攻擊者不能建立包含200KB資料的請求。對於任何基於JavaScript的約束也是如此。

華夏公益教科書