轉自:http://www.codingforums.com/showthread.php?t=176717
php編程安全指南
1、一般
1)lamp系統安全設定
2)php.ini安全設定
3)使用MVC架構
2、資料轉送
1)在$_GET的$_POST,$_COOKIE,和$_REQUEST中,消毒和驗證之前以編程方式操縱資料中包含的所有資料
2)SQL注入
定義:代碼注入技術,利用一個安全性漏洞,在應用程式的資料庫層發生。該漏洞是存在的,當使用者輸入或者不正確的字串文字逸出字元中嵌入SQL語句或使用者輸入不強型別,從而意外地執行過濾。
預防:mysql_real_escape_string($string)
3)跨網站指令碼(XSS)
定義:安全性漏洞,通常在Web應用程式的其他使用者瀏覽網頁,它允許惡意web使用者將代碼注入。這樣的例子:包括用戶端指令碼(即JavaScript)的。
預防:htmlentities(strip_tags($string))
3、瀏覽器的請求
1)跨網站請求偽造(CSRF)
定義:攻擊通過在授權使用者訪問的頁面中包含連結或者指令碼的方式工作。例如:一個網站使用者Bob可能正在瀏覽聊天論壇,而同時另一個使用者Alice也在此論壇中,並且後者剛剛發布了一個具有Bob銀行連結的圖片訊息。設想一下,Alice編寫了一個在Bob的銀行網站上進行取款的form提交的連結,並將此連結作為圖片tag。如果Bob的銀行在cookie中儲存他的授權資訊,並且此cookie沒有到期,那麼當Bob的瀏覽器嘗試裝載圖片時將提交這個取款form和他的cookie,這樣在沒經Bob同意的情況下便授權了這次事務。
預防:產生一個獨特的“令牌”,通常當一個瀏覽器會話的開始。通過令牌在所有POST和GET請求。繼POST/ GET行動,檢查存在的會話令牌,然後確認郵寄令牌/ GET儲存在會話中的令牌相同。 (像CakePHP的MVC架構,使得這個比較容易實現整個應用程式的統一。)
4、Sessions
1)殺死一個會話時,銷毀會話資料
當session會話完成後(“登出”),銷毀其資料,不只是清除cookie,否則惡意使用者能重新恢複cookie和再次使用session。可以將$_SESSION中的所有索引置空
2)以檔案形式儲存session在網站的webroot檔案或儲存在資料庫
在伺服器上儲存session的預設路徑可以被劫持的,尤其是在一個共用的主機環境。
5、密碼
1)應用強密碼
需要數字,符號,大寫和小寫字母的密碼
密碼長度應該在12至14個字元
2)加密
至少使用SHA1()雜湊加密(不使用md5()),hash()函數提供了一些額外的雜湊選擇,包括SHA256。添加一個“特定的應用程式”來加密
6、一般的php.ini配置
1)Disable register_globals
預防: register_globals = Off
2)Disable magic quotes
預防: magic_quotes_gpc = Off
3)Disable error reporting
預防: display_errors = Off
4)Enable error logging and save log file to a directory above web root
預防: log_errors = On;
ignore_repeated_errors = On;
html_errors = Off;
error_log = /path/above/webroot/logs/php_error_log
5)儲存session資料到webroot的目錄下
預防: session.save_path = /path/above/webroot/sessions
7、webroot下載的.htaccess檔案
1)Disable directory listings site-wide
預防: Options -Indexes
8、重要/敏感檔案
1)防止未經授權的訪問/下載
這包括網站管理/成員,部分網站/資料庫設定檔等
2)使用指令檔作為中介,作為附件
3)不斷更新你的指令碼(WordPress的,phpMyAdmin的,等)的密碼。
4)當你正在使用時可以使phpMyAdmin允許訪問,這可防止別人對您的利用"零日漏洞"破壞
“零日漏洞”(zero-day)又叫零時差攻擊,是指被發現後立即被惡意利用的安全性漏洞。通俗地講,即安全補丁與瑕疵曝光的同一日內,相關的惡意程式就出現。這種攻擊往往具有很大的突發性與破壞性。
9、檔案上傳
1)在資料操作前一定要對$_FILES進行驗證,判斷檔案是否已經在 $_FILES 中
2)請注意提供的MIME類型可能欺騙或其導致他方式錯誤
3)所有使用者上傳的檔案應移動到網站根目錄以上的目錄
4)不要執行使用者上傳的檔案,或者用include require等包含使用者上傳的檔案
5)盡量不要設定指令碼類型為application/octet-stream,” “application/unknown,” or “plain/text”
10、其他
在webroot下,被網站開發人員建立和使用的“工具 + 生產力”檔案/程式,如果不打算被網站使用者訪問和使用,那麼在放到外網之前應該將他們全部刪除,降低的網站的安全風險。