開頭先寫自己還是個很弱的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 的網站上有表單