本文實例講述了PHP防止sql注入小技巧之sql預處理原理與實現方法。分享給大家供大家參考,具體如下:
我們可以把sql預處理看作是想要運行的 SQL 的一種編譯過的模板,它可以使用變量參數進行定制。
我們來看下它有什么好處:
- 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。
- 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
- 預處理語句針對SQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。
這種預處理呢,可以通過兩個方式,咱們這次要說的是mysqli。它任何時候都可以確保應用程序可以用相同的數據訪問模式,比PDO要更加實用。
預處理呢,它有兩種語句,一種是dml語句,另一種是dql語句。咱們先來看第一種:
?php
header('Content-type:text/html;charset=utf-8');
$mysqli = new mysqli("127.0.0.1","root","root","test");
$mysqli->query('set names utf8');
$insert = $mysqli->prepare("insert admins (title,cookies,sta,lid) values (?,?,?,?)");
$title = "cuijinpeng";
$cookies = "luyaran201314";
$sta = "1";
$lid = 1;
$insert->bind_param("sssi",$title,$cookies,$sta,$lid);
$res = $insert->execute();
if($res){
echo 1;
}else{
echo $insert->error;
echo 0;
}
$insert->close();
$mysqli->close();
第二種呢,代碼如下:
?php
header('Content-type:text/html;charset=utf-8');
$mysqli = new mysqli("127.0.0.1","root","root","test");
$mysqli->query('set names utf8');
$select = $mysqli->prepare("select id,title,cookies,sta,lid from admins where id > ?");
$id = "1";
$select->bind_param("i",$id);
$select->bind_result($id,$title,$cookies,$sta,$lid);
$select->execute();
while ($select->fetch()) {
echo $id."---".$title."---".$cookies."---".$sta."---".$lid."br>";
}
$select->close();
$mysqli->close();
接下來,咱們就該看下這兩種語句分別支持什么樣子的sql了。
第一種呢,它支持insert、update、delete這三種類型的sql,第二種嘞,就是查詢語句了。
完事那個bind_param里的那個i,就是咱們傳入參數的類型了,具體介紹如下:
- i - integer(整型)
- d - double(雙精度浮點型)
- s - string(字符串)
- b - BLOB(binary large object:二進制大對象)
我們傳入的每個參數都需要指定類,這樣通過告訴數據庫參數的數據類型,可以降低 SQL 注入的風險。
好啦,本次記錄就到這里了。
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php程序設計安全教程》、《php安全過濾技巧總結》、《PHP運算與運算符用法總結》、《PHP基本語法入門教程》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- 詳解php命令注入攻擊
- php使用exec shell命令注入的方法講解
- 淺析PHP反序列化中過濾函數使用不當導致的對象注入問題
- PHP依賴注入容器知識點淺析
- PHP使用PDO實現mysql防注入功能詳解
- php+laravel依賴注入知識點總結
- php依賴注入知識點詳解
- php中的依賴注入實例詳解
- thinkphp5.1框架容器與依賴注入實例分析
- PHP進階學習之依賴注入與Ioc容器詳解
- php反射學習之依賴注入示例
- CTF命令執行及繞過技巧