PHP安全編程法則
標有 (*) 的檢查項目表示該項是針對相關問題的根本解決方法,應當盡最大努力去完成這些內容。 未標 (*) 的項目,表示該項并不能完全消除安全隱患,只是說通過這種方法可以避免發生安全問題。
SQL注射(*) 在組合SQL語句時要使用SQL變量綁定功能(*) 如果數據庫不提供變量綁定,那么需要對構成SQL的所有變量進行轉義不要將錯誤信息原封不動地顯示在瀏覽器中。為訪問數據庫的用戶設置適當的權限。操作系統命令行注射(*) 避免使用能啟動shell命令的語言使用的語言如果允許啟動shell命令,則需要對該功能的參數種的所有變量進行檢查,確保只包含合法的操作不檢查路徑名參數/目錄遍歷(*) 不要將外部傳進來的參數直接作為文件名來使用(*) 將打開文件的操作限制在固定的目錄中,并禁止文件名中包含路徑為Web服務器上的文件設置正確的訪問權限檢查文件名會話管理的問題(*) 用難以推測的內容作為會話ID(*) 不要在URL中保存會話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