一直以來WEB的安全都是非常嚴峻的話題。其中SQL注入是較常見的攻擊手段,很多時候,我們的程式碼都是為了處理不合規的數據,防止注入。但PHP作為弱型語言,總是有我們未能考慮到的風險。本文分享了一個簡單卻很有效的防止SQL注入的方法!
記得很久以前看過一位大牛說過的一句話,在一個程式中,60%的程式碼都應該是在進行各種防禦。
其實,現在來看,防禦sql注入其實不需要進行各種參數過濾,以下將開啟乾貨模式!
PHP5.x開始引進了一種新的mysql操作方式-----mysqli,在php中也有一個對應的操作方式叫做PHP預處理。採用物件導向的方式來進行參數化綁定操作,由於對資料庫操作的模式驅動不同,因此可以非常有效的防禦sql注入。
首先,我們先來看一段程式碼範例
<!--?php $root = "root"; $pwd = "root"; $host = "localhost"; $database = "database"; $conn = new mysqli($host,$root,$pwd,$database);//面向对象的方式实例化一个对象 $keywords = $_GET['keywords']; $search_sql = "select content from mykey where title = ? ";//其中的?是一个占位符 $search_action = $conn --->prepare($search_sql);//进行预处理操作 $search_action ->bind_param("s",$keywords);//绑定参数,第一个参数表示为上面预处理的的占位符的数量和每一个参数的数据类型,s为字符串,i为整形,d为双精度小数,有几个参数,就写几个s或d或i,比如说iiii,ssss,sidi这样的。然后后面就是有几个参数就写几个要绑定的变量,比如bind_param('sss',$username,$password,$code); $search_action ->bind_result($content);//将结果绑定在相对应的变量上,比如你select了username,password,你就可以写bind_result($usernmae,$password); $search_action ->execute();//执行sql操作 while($search_action ->fetch()){ echo $content.'<br>'; } $search_action ->free_result();//释放内存 $search_action ->close();//结束这个实例化 ?>
上面是php預處理中一個非常簡單的例子,它內建的其他函數能很方便我們的開發速度,那麼看到這裡,很多人可能還是不明白,有人可能想問,你這個綁定參數是不是還是在拼湊sql語句?如果是拼湊語句,那還不是會產生注入嗎
這就要從他的操作原理來解釋了,其實它在prepare操作中,就已經在資料庫中,執行了語句,以後的綁設定參數和執行,只不過是再傳遞資料進去而已,所以根本不會跟sql語句拼接,也就自然不會將危險程式碼執行。因此,在這種模式下sql注入就能很有效的被防禦了。
在php預處理的類別中有很多很好用的操作,這將在以後的文章中為大家總結一些常用的php預處理的開發語句。
相關推薦:
Discuz7.2版的faq.php SQL注入漏洞分析,discuz7.2faq.php_PHP教學
以上是PHP簡單高效防禦sql注入的方法分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!