天天看點

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 注入的風險。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。