長期以來,web的安全性存在着巨大的爭議與挑戰。其中,sql注入就是一種常見的一種攻擊方法,開發人員普遍的做法就是不停的過濾,轉義參數,可是我們php大法天生弱類型的機制,總是讓黑客有機可乘,繞過防禦與防禦總是在明爭暗鬥。
記得很久以前看到過一位大牛說過的一句話,在一個程序中,60%的代碼都應該是在進行各種防禦。
其實,現在來看,防禦sql注入其實並不需要進行各種參數過濾,以下將開啓乾貨模式!
PHP5.x開始引入了一種新的mysql操作方式-----mysqli,在php中也有一項相應的操作方式叫做PHP預處理。採用面向對象的方式來進行參數化綁定操作,由於對數據庫操作的模式驅動不同,因此可以非常有效的防禦sql注入。
首先,我們先來看一段代碼例子
05 |
$database = "database" ;
|
06 |
$conn = new mysqli( $host , $root , $pwd , $database );
|
07 |
$keywords = $_GET [ 'keywords' ];
|
08 |
$search_sql = "select content from mykey where title = ? " ;
|
09 |
$search_action = $conn --->prepare( $search_sql );
|
10 |
$search_action ->bind_param( "s" , $keywords );
|
11 |
$search_action ->bind_result( $content );
|
12 |
$search_action ->execute();
|
13 |
while ( $search_action ->fetch()){
|
16 |
$search_action ->free_result();
|
17 |
$search_action ->close();
|
|
上面是php預處理中一個非常簡單的例子,它內置的其他函數能很方便我們的開發速度,那麼看到這裏,很多人可能還是不明白,有人可能想問,你這個綁定參數是不是還是在拼湊sql語句?如果是拼湊語句,那還不是會產生注入嗎
這就要從他的操作原理來解釋了,其實它在prepare操作中,就已經在數據庫中,執行了語句,以後的綁定參數和執行,只不過是再傳遞數據進去而已,所以根本不會和sql語句拼接,也就自然不會將危險代碼執行。因此,在這種模式下sql注入就能很有效的被防禦了。
在php預處理的類中有很多很好用的操作,具體將會在以後的文章中爲大家總結一些常用的
php預處理的開發語句。