首頁我是相片相簿文字 » php 變數安全性處理
php 變數安全性處理2011-02-24
PHP + MySQL 變數安全性議題

開頭先寫自己還是個很弱的php菜鳥,

由於買的三本參考書完全沒有強調 php的安全性,

在搜尋一些技術後發現安全性的重要後, 筆記此文記錄用。

也歡迎更正及補充.

php的函式function



函式時常需要接收會送出變數供其它函式使用.

所以在接受變數及設計函式流程時,

要注意可能的攻擊情況 (1)SQL injection, (2) XSS跨站腳本攻擊

1. SQL injection 注入攻擊

著名的SQL injection 資料隱碼攻擊 (注入攻擊) 就是在輸入欄位中填入


'1 or '1'='1


然後按下 send, 若php的編碼過程沒有思考過, 所有的資料通通都會成為公開 (包含帳號+密碼)


所以若是變數會被丟進資料庫成為SQL語句的, 一定要小心這些符號 ';) 挑眉眨眼人。


危險字符有 ' " ; ) / - ...


可能的防範方式:


1.1 字串過濾: 將會進資料庫處理的變數進行過濾: 限制長度, 排除危險字元, 排除SQL攻擊單詞


1.2 設置預設值予 sql 相關變數, 屬於SQL會處理的變數請務必設定一個預設值.


1.3 權限最小化: 將PHP-與資料庫進行資料連線的使用者帳號, 權限最小化 ( Select Only),


1.4 magic_quotes_gpc 設定為 On, 可加斜線至特殊字元! (但PHP6已取消此設定,不建議)


1.5 使用php預設的MySQL轉換字串函數, 在丟進資料庫前預先處理變數: mysql_real_escape_string();


1.6 排除危險字元的其它編碼,例: 0xbf27 (單引號 ' )..等


1.7 htmlspecialchars() 處理特別符號, 不建議用htmlentitles ()在中文時有許功蓋問題.


~

2. XSS 跨站腳本攻擊

XSS 是最難防範的攻擊。


跨站攻擊指的是: 例如我在自己的主機 ymc2.com , 寫一個表單,


但是表單 action 的對象是 google.com, 這樣子就會形成跨站的表單。


延伸一點就可以想成是另類的 SQL 注入攻擊, 彈性較大。


一個 php+MySQL 的網站上有表單

的存在是很正常的事情。


若有心人士將你的表單下載回去後, 稍做編輯再上傳到某主機上,


就可以try你寫的函式function, 找到期待的漏洞...


可能的防範方式:


2.1 表單千萬不要使用 $_SERVER['PHP_SELF'] 當做 Action 的主體.


2.2 利用 .htaccess 設置本機 action Only


~

3. 手動變更 $_GET[變數] 值

第三種則是較直覺的攻擊方法, 也可視為 SQL 注入


PHP處理表單的程序時通常有 POST 與 GET 方法;


由於 GET的值會顯示在 URL 上,


所以只要在網址列手動改變 GET[變數]的值,


就有可能發生不可預期的危險~


防範方式:


3.1 字串過濾: 同1.1, 利用preg_match, 及正規表達式在函式中處理 $_GET[變數]


3.2 不要直接使用 "$_GET[變數]" 的寫法放進作業內容


3.3 盡量不要讓使用者知道 $_GET[變數] 被你做過什麼處理, 顯示原始查詢文字在網頁上


3.4 同 1.2 給予 $_GET[變數] 預設值, 或 Switch 控制


~

以上, 暫分享至此。謝謝指教

參考資料

1. Steve Friedl, SQL Injection Attacks Samples

2. Hackpedia, SQL Injection
Leave a comment*required

Howdy, Leave a comment here :)