標示(*) 的檢查項目表示該項是針對相關問題的根本解決方法,應盡最大努力完成這些內容。 未標(*) 的項目,表示該項並不能完全消除安全隱患,只說透過這種方法可以避免發生安全問題。
SQL注射
(*) 在組合SQL語句時要使用SQL變數綁定功能
(*) 如果資料庫不提供變數綁定,那麼需要對構成SQL的所有變數進行轉義不要將錯誤訊息原封不動地顯示在瀏覽器中。
為存取資料庫的使用者設定適當的權限。
作業系統命令列注射
(*) 避免使用能啟動shell命令的語言使用的語言如果允許啟動shell命令,則需要對該功能的參數種的所有變數進行檢查,確保只包含合法的操作不檢查路徑名參數/目錄遍歷
(*) 不要將外部傳進來的參數直接當作檔案名稱來使用
(*) 將開啟檔案的操作限制在固定的目錄中,並禁止檔案名稱中包含路徑為網路伺服器上的檔案設定正確的存取權限檢查檔案名稱會話管理的問題
(*) 以難以推測的內容作為會話ID
(*) 不要在網址中保存會話ID
(*) 為https協定中使用的cookie設定secure屬性
(*) 登入成功後產生新的會話
(*) 登入成功後,在會話ID之外再產生一個秘密訊息,每次造訪頁面時都檢查之不使用固定值作為會話ID
將會話ID儲存到Cookie中時,要設定有效期限跨站腳本攻擊(XSS)
不允許輸入HTML內容時的解決方法
(*) 輸出到頁面上的所有內容都要轉義
(*) 輸出URL時僅允許以「http://」或「https://」開頭的URL
(*) 不要動態產生<script>…</script>的內容
(*) 不要從外部網站讀入樣式表檢查輸入內容允許輸入HTML內容時的解決方法
(*) 解析輸入的HTML內容,產生解析樹,然後提取其中的非腳本部分使用腳本刪除輸入的HTML內容中的相關字串通用解決方法
(*) 應答的HTTP頭重指定Content-Type的charset屬性為避免Cookie情報洩漏,應禁止Trace方法,並對所有Cookie設定HttpOnly屬性跨站請求偽造(CSRF)
(*) 所有頁面都透過POST來訪問,在前一頁面的hidden中隨機生成一個信息,提交後的頁面檢查該信息,正確時才予以執行
(*) 執行業務之前再次要求輸入密碼
(*) 確認Referer是否正確,只有正確時才執行執行重要操作時,向預先設定的郵件地址發送郵件
HTTP頭注射
(*) 不直接輸出HTTP頭,而使用運行環境提供的頭資訊輸出API
(*) 無法使用API時,要禁止輸入的頭資訊中的換行刪除所有外部輸入中的換行郵件盜用(透過某種手段使郵件發送到攻擊者指定的地址)
(*) 不使用外部參數作為郵件頭資訊必須以外部參數設定頭資訊時,要刪除其中的危險字元。
版權聲明:可任意轉載,但轉載時必須標明原作者charlee。
原始連結: http://tech.idv2.com/2008/04/19/secure-website-checklist/
具體的應用策略參考:PHP 實務Security Checklist