整理一些PHP開發安全問題
php給了開發人員極大的靈活性,但是這也為安全問題帶來了潛在的隱患,近期需要總結一下以往的問題,在這裡借翻譯一篇文章同時加上自己開發的一些感觸總結一下。
簡介
當開發一個互連網服務的時候,必須時刻牢記安全觀念,並在開發的代碼中體現。PHP指令碼語言對安全問題並不關心,特別是對大多數沒有經驗的開發人員來說。每當你講任何涉及到錢財事務等交易問題時,需要特別注意安全問題的考慮,例如開發一個論壇或者是一個購物車等。
安全保護一般性要點
不相信表單
對於一般的Javascript前台驗證,由於無法得知使用者的行為,例如關閉了瀏覽器的javascript引擎,這樣通過POST惡意資料到伺服器。需要在伺服器端進行驗證,對每個php指令碼驗證傳遞到的資料,防止XSS攻擊和SQL注入
不相信使用者
要假設你的網站接收的每一條資料都是存在惡意代碼的,存在隱藏的威脅,要對每一條資料都進行清理
關閉全域變數
在php.ini檔案中進行以下配置:
register_globals = Off
如果這個配置選項開啟之後,會出現很大的安全隱患。例如有一個process.php的指令檔,會將接收到的資料插入到資料庫,接收使用者輸入資料的表單可能如下:
這樣,當提交資料到process.php之後,php會註冊一個$username變數,將這個變數資料提交到process.php,同時對於任何POST或GET請求參數,都會設定這樣的變數。如果不是顯示進行初始化那麼就會出現下面的問題(參考:http://www.lai18.com/content/434606.html)
此處,假設authenticated_user函數就是判斷$authorized變數的值,如果開啟了register_globals配置,那麼任何使用者都可以發送一個請求,來設定$authorized變數的值為任意值從而就能繞過這個驗證。
所有的這些提交資料都應該通過PHP預定義內建的全域數組來擷取,包括$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST等,其中$_REQUEST是一個$_GET/$_POST/$_COOKIE三個數組的聯合變數,預設的順序是$_COOKIE、$_POST、$_GET。
推薦的安全配置選項
error_reporting設定為Off:不要暴露錯誤資訊給使用者,開發的時候可以設定為ON
safe_mode設定為Off
register_globals設定為Off
將以下函數禁用:system、exec、passthru、shell_exec、proc_open、popen
open_basedir設定為 /tmp ,這樣可以讓session資訊有儲存許可權,同時設定單獨的網站根目錄
expose_php設定為Off
allow_url_fopen設定為Off
allow_url_include設定為Off
SQL注入攻擊
對於操作資料庫的SQL語句,需要特別注意安全性,因為使用者可能輸入特定語句使得原有的SQL語句改變了功能。類似下面的例子:
擴充閱讀
《PHP安全編程系列》系列技術文章整理收藏
PHP安全編程系列收藏夾收藏了有關PHP安全編程方面的知識,對PHP安全編程提供學習參考
1discuz的php防止sql注入函數
2php防止xss攻擊的方法
3PHP安全編程:對輸出要進行轉義
4PHP安全編程:過濾使用者輸入
5PHP安全編程:可用性與資料跟蹤
6PHP安全編程:不要讓不相關的人看到報錯資訊
7PHP安全編程:register_globals的安全性
8PHP安全編程:網站安全設計的一些原則
9PHP安全編程:關於表單欺騙提交
10PHP安全編程:HTTP請求欺騙
11PHP安全編程:不要暴露資料庫存取權限
12PHP安全編程:跨站請求偽造CSRF的防禦
13PHP安全編程:表單與資料安全
14PHP安全編程:從URL的語義進行攻擊
15PHP安全編程:檔案上傳攻擊的防禦
16PHP安全編程:跨站指令碼攻擊的防禦
17PHP安全編程:session固定擷取合法會話
18PHP安全編程:防止SQL注入
19PHP安全編程:cookie暴露導致session被劫持
20PHP安全編程:防止原始碼的暴露
21PHP安全編程:留心後門URL
22PHP安全編程:session劫持的防禦
23PHP安全編程:暴力破解攻擊
24PHP安全編程:密碼嗅探與重播攻擊
25PHP安全編程:記住登入狀態的安全做法
26PHP安全編程:shell命令注入
27PHP安全編程:開啟遠程檔案的風險
28PHP安全編程:檔案目錄猜測漏洞
29PHP安全編程:阻止檔案名稱被操縱
30PHP安全編程:檔案包含的代碼注入攻擊
31PHP安全編程:更優的會話資料安全
32PHP安全編程:共用主機的源碼安全
33PHP安全編程:會話資料注入
34PHP安全編程:主機檔案瀏覽目錄
35PHP安全編程:PHP的安全模式
36php安全之直接用$擷取值而不$_GET 字元轉義
37php防止漏洞策略,建立高效能web
38什麼XSS攻擊?PHP防止XSS攻擊函數
39解析php防止form重複提交的方法
40php安全之狗尾續貂
41PHP防止跨域提交表單
42php防止SQL注入詳解及防範
43php防止sql注入代碼執行個體
44php防止sql注入樣本分析和幾種常見攻擊Regex
45PHP安全之防止你的原始碼或重要配置資訊暴露在外
46PHP防止post重複提交資料的簡單例子
47php防止偽造的資料從URL提交方法
48PHP防止表單重複提交的幾種常用方法匯總
49php防止偽造資料從地址欄URL提交的方法
50php防止站外遠程提交表單的方法
51php防止sql注入之過濾分頁參數執行個體
52PHP安全之以Apache模式安裝時可能遇到的攻擊及解決辦法
53PHP安全之檔案系統安全及防範措施
54PHP安全之檔案系統安全??Null字元問題
55PHP安全之資料庫安全??SQL注入及預防措施
56PHP安全之簡介和總則
57PHP安全之以CGI 模式安裝時可能遇到的攻擊及解決辦法
58PHP安全之使用者提交的資料
59PHP安全之資料庫安全??設計、串連和加密
60PHP安全之魔術引號??什麼是魔術引號以及如何使用
61PHP安全之隱藏PHP指令碼副檔名
62PHP安全之使用 Register Globals
63PHP安全之錯誤報表
64php防止惡意重新整理與刷票的方法
65php防止網站被重新整理的方法匯總
66PHP網站常見安全性漏洞,及相應防範措施總結