php最有效防禦sql注入攻擊的方

長期以來,web的安全性存在着巨大的爭議與挑戰。其中,sql注入就是一種常見的一種攻擊方法,開發人員普遍的做法就是不停的過濾,轉義參數,可是我們php大法天生弱類型的機制,總是讓黑客有機可乘,繞過防禦與防禦總是在明爭暗鬥。
記得很久以前看到過一位大牛說過的一句話,在一個程序中,60%的代碼都應該是在進行各種防禦。
 其實,現在來看,防禦sql注入其實並不需要進行各種參數過濾,以下將開啓乾貨模式!
PHP5.x開始引入了一種新的mysql操作方式-----mysqli,在php中也有一項相應的操作方式叫做PHP預處理。採用面向對象的方式來進行參數化綁定操作,由於對數據庫操作的模式驅動不同,因此可以非常有效的防禦sql注入。
 首先,我們先來看一段代碼例子

01 <!--?php
02 $root "root";
03 $pwd "root";
04 $host "localhost";
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);//綁定參數,第一個參數表示爲上面預處理的的佔位符的數量和每一個參數的數據類型,s爲字符串,i爲整形,d爲雙精度小數,有幾個參數,就寫幾個s或d或i,比如說iiii,ssss,sidi這樣的。然後後面就是有幾個參數就寫幾個要綁定的變量,比如bind_param('sss',$username,$password,$code);
11 $search_action ->bind_result($content);//將結果綁定在相對應的變量上,比如你select了username,password,你就可以寫bind_result($usernmae,$password);
12 $search_action ->execute();//執行sql操作
13 while($search_action ->fetch()){
14 echo $content.'<br>';
15 }
16 $search_action ->free_result();//釋放內存
17 $search_action ->close();//結束這個實例化
18  
19 ?>

上面是php預處理中一個非常簡單的例子,它內置的其他函數能很方便我們的開發速度,那麼看到這裏,很多人可能還是不明白,有人可能想問,你這個綁定參數是不是還是在拼湊sql語句?如果是拼湊語句,那還不是會產生注入嗎
這就要從他的操作原理來解釋了,其實它在prepare操作中,就已經在數據庫中,執行了語句,以後的綁定參數和執行,只不過是再傳遞數據進去而已,所以根本不會和sql語句拼接,也就自然不會將危險代碼執行。因此,在這種模式下sql注入就能很有效的被防禦了。
    在php預處理的類中有很多很好用的操作,具體將會在以後的文章中爲大家總結一些常用的php預處理的開發語句。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章