|
長期以來,web的安全性存在著巨大的爭議與挑戰(zhàn)。其中,sql注入就是一種常見的一種攻擊方法,開發(fā)人員普遍的做法就是不停的過濾,轉(zhuǎn)義參數(shù),可是我們php大法天生弱類型的機制,總是讓黑客有機可乘,繞過防御與防御總是在明爭暗斗。 PHP大牛說過一句話,在一個程序中,60%的代碼都應(yīng)該是在進行各種防御。 其實,現(xiàn)在來看,防御sql注入其實并不需要進行各種參數(shù)過濾,以下將開啟干貨模式! PHP5.x開始引入了一種新的mysql操作方式-----mysqli,在php中也有一項相應(yīng)的操作方式叫做PHP預處理。采用面向?qū)ο蟮姆绞絹磉M行參數(shù)化綁定操作,由于對數(shù)據(jù)庫操作的模式驅(qū)動不同,因此可以非常有效的防御sql注入。 首先,我們先來看一段代碼例子 php代碼: <!--?php $root = "root"; $pwd = "root"; $host = "localhost"; $database = "database"; $conn = new mysqli($host,$root,$pwd,$database);//面向?qū)ο蟮姆绞綄嵗粋€對象 $keywords = $_GET['keywords']; $search_sql = "select content from mykey where title = ? ";//其中的?是一個占位符$search_action = $conn --->prepare($search_sql);//進行預處理操作 $search_action ->bind_param("s",$keywords);//綁定參數(shù),第一個參數(shù)表示為上面預處理的的占位符的數(shù)量和每一個參數(shù)的數(shù)據(jù)類型,s為字符串,i為整形,d為雙精度小數(shù),有幾個參數(shù),就寫幾個s或d或i,比如說iiii,ssss,sidi這樣的。然后后面就是有幾個參數(shù)就寫幾個要綁定的變量,比如bind_param('sss',$username,$password,$code); $search_action ->bind_result($content);//將結(jié)果綁定在相對應(yīng)的變量上,比如你select 了username,password,你就可以寫bind_result($usernmae,$password); $search_action ->execute();//執(zhí)行sql操作 while($search_action ->fetch()){ echo $content.'<br>'; } $search_action ->free_result();//釋放內(nèi)存 $search_action ->close();//結(jié)束這個實例化 ?> 上面是php預處理中一個非常簡單的例子,它內(nèi)置的其他函數(shù)能很方便我們的開發(fā)速度,那么看到這里,很多人可能還是不明白,有人可能想問,你這個綁定參數(shù)是不是還是在拼湊sql語句?如果是拼湊語句,那還不是會產(chǎn)生注入嗎? 這就要從他的操作原理來解釋了,其實它在prepare操作中,就已經(jīng)在數(shù)據(jù)庫中,執(zhí)行了語句,以后的綁定參數(shù)和執(zhí)行,只不過是再傳遞數(shù)據(jù)進去而已,所以根本不會和sql 語句拼接,也就自然不會將危險代碼執(zhí)行。因此,在這種模式下sql注入就能很有效的被防御了。 在php預處理的類中有很多很好用的操作,具體的將會在以后的文章中為大家總結(jié)一些常用的php預處理的開發(fā)語句。
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|