網路應用程式安全指南/不安全的 資料傳輸
未加密傳輸的資料可以被嗅探。這不僅可以為攻擊者提供有價值的資訊,還可以提供會話 cookie 的內容,使攻擊者能夠劫持會話。此外,不安全的通訊可以被攻擊者修改。
要防止這種型別的攻擊
- 對任何和所有資料傳輸使用 SSL/TLS (https)
- 不要透過 http 開始通訊,只在“需要”時重定向到 https
- 使用“secure”屬性標記 cookie
- 儘可能使用 Strict-Transport-Security 標頭
- 教育使用者訪問https://URL 直接
- 如果您的網路應用程式執行 HTTPS 請求,請確保它驗證證書和主機名
- 如果連線到內部伺服器,請考慮限制受信任的 CA
基本原理
使用 https 確保所有資料傳輸都已加密,並且伺服器已透過身份驗證。未加密頁面傳送的重定向可以被攻擊者刪除或修改。因此,從普通 http 到 https 的過渡可以被破壞,使任何在切換到 https 之前的普通 http 通訊變得危險。將 cookie 標記為僅安全確保它們永遠不會透過未加密的連線傳輸,以防止嗅探。
STS 標頭確保在首次訪問後,即使使用者訪問http://URL,請求透過安全 https 執行。這可以防止對未加密重定向的 SSLstrip 攻擊。教育使用者直接訪問https://URL 直接為第一個請求和不支援 STS 且忽略標頭的瀏覽器提供此保護。這種教育可以透過在埠 80 上不提供任何內容或只提供沒有可點選連結的資訊頁面來支援,以強制使用者輸入正確的 URL 並消除偷懶並省略“https://”的動機。
在某些網路應用程式中,網路伺服器執行 HTTPS 請求(例如,當獲取或推送資料到 API 或執行 OpenID 或 OAuth 協議時)。只有當啟動連線的軟體(即您的網路應用程式)正確驗證遠端證書時,HTTPS 才是安全的。
- 檢查證書是否仍然有效
- 檢查證書是否由受信任的 CA 簽署(需要受信任的 CA 列表)
- 檢查您正在連線到的主機名是否與證書中的名稱匹配(執行 SSL 處理的包裝器需要訪問主機名)
某些庫預設情況下不會這樣做,這使得 HTTPS 連線不安全!如果您不需要提供受信任的 CA 列表,或者看起來 SSL 包裝器無法訪問您正在連線到的主機名,請將其視為可疑。要測試此問題,請嘗試連線到使用未過期自簽名證書的主機,然後嘗試連線到使用有效證書但使用與證書中指定的名稱不同的主機名(例如,按其 IP 地址定址主機)的主機。如果這兩個連線都成功,您的庫/配置就不安全。
在 PHP 中,執行 HTTP(S) 請求的兩種標準方法都存在問題:如果使用低於 7.10 版本的 cURL,cURL 庫預設情況下不會檢查證書。Stream API 始終需要顯式配置(影響所有使用 url_fopen 的函式,例如 fopen()、file()、file_get_contents())。對於 cURL,請設定 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_CAINFO。對於 Stream API,請使用帶有 verify_peer、CN_match 和 cafile SSL 上下文選項 的流上下文。
如果您正在連線到內部伺服器,請考慮將受信任的 CA 列表限制為您正在使用的 CA。這降低了來自受損/惡意 CA 的風險。預設的 CA 包通常包括您可能認為不可信的 CA,例如中國網際網路主管部門 CNNIC。