2010年5月23日 星期日

PHP實作安全機制(2)

Injection attack是一種常見的網路攻擊型態
表單欄位是Web應用程式安全上的弱點
它提供了使用者輸入資料的空間卻又難以預料使用者的行為

攻擊作法的舉例:

假設有個欄位輸入的資料會以以下SQL指令存入到SQL資料庫裡
INSERT INTO table1 VALUES(0, $name, $score, 0)
假如在欄位裡面故意輸入10000', 1) --
注意--後面有一格空格, 這會讓資料庫儲存的資料被更改
被更改的原因是因為SQL的註解方式是( -- )
存入之後便會讓後方的資料被忽略,而存進他填進來的資料

這種注入攻擊是極端麻煩的一件事,而且SQL的註解方式不只這一種
即使對於資料竄改沒有湊效,填進的特殊字元也可能讓資料庫產生錯誤
所以一定要設法避免這種情形發生

解決方法:

利用PHP的 trim()、mysqli_real_escape_string()兩個函式來處理
trim($_POST['XXX']),這個函式可以去除資料表單頭尾處的空白
mysqli_real_escape_string($dbc, trim($_POST['XXX']))
函式的第一個參數是資料庫連結變數
它可以將有危險性字元脫逸掉,使他們可以出現在表單裡,但卻不會影響正常查詢

另外有幾個作法可以幫助資料輸入的安全性
INSERT查詢寫成明確指出要將哪個值插入哪個欄位
有自動產生值或是預設值的欄位就不提供輸入的機會

減少注入攻擊的方法還有進行表單驗證、
檢查檔案類型或是尺寸是否在規範內、
檢查欄位是否有填入資料、
預期只會填入數字的欄位也可以用 is_numeric()函式來做驗證
這些方法都能將安全性再提高些。

沒有留言:

張貼留言