Mysql引數化查詢,防止Mysql注入

2021-08-20 04:47:49 字數 1422 閱讀 7424

有部分的開發人員可能會認為使用引數化查詢,會讓程式更不好維護,或者在實現部分功能上會非常不便[**請求],然而,使用引數化查詢造成的額外開發成本,通常都遠低於因為sql注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。

除了安全因素,相比起拼接字串的sql語句,引數化的查詢往往有效能優勢。因為,引數化的查詢能讓不同的資料通過引數到達資料庫,從而公用一條sql語句。大多數資料庫會快取解釋sql語句產生的位元組碼而省下重複解析的開銷。如果採用拼接字串的sql語句,則會用於運算元據是sql語句的一部分而非引數的一部分,而反覆大量解釋sql語句產生不必要的開銷。

mysql的引數格式是以 "?" 字元加上引數名稱而成。

update mytable set c1 = ?c1, c2 = ?c2, c3 = ?c3 where c4 = ?c4

1、pdo

pdo用於php之內。在使用pdo驅動時,引數查詢的使用方法一般為:

// 例項化資料抽象層物件

$db = new pdo('pgsql:host=127.0.0.1;port=5432;dbname=testdb');

// 對 sql 語句執行prepare,得到pdostatement物件$stmt = $db->prepare('select * from mytable where "id" = :id and "is_valid" =  :is_valid');

// 繫結引數 

$stmt->bindvalue(':id',$id);

$stmt->bindvalue(':is_valid',true);

// 查詢

$stmt->execute();

// 獲取資料

froeacha($stmt as $row)

2、mysqli

$db = new mysqli("localhost","user","pass","database");

$stmt = $db->prepare("select priv from testusers where username=? and password=?");

$stmt->bind_param("ss",$user,$pass);

$stmt->execute();

3、mysql_real_escape_string 

值得注意的是,以下方式雖然能有效防止sql注入 (歸功於 mysql_real_escape_string 函式的轉義),但並不是真正的引數化的查詢,其本質仍然是拼接字串的sql語句。

$query = sprintf("select * from user where username='%s' and password='%s',mysql_real_escape_string($username),mysql_real_escape_string($password)");

$mysql_query($query);

引數化防止注入

string strsql insert into student name,gender,banji,student id,phone,qq,describe,time values name,gender,banji,student id,phone,qq,describe,time sqlpa...

MySql引數化模糊查詢

今天在做mysql模糊查詢的時候碰到一些問題,利用引數化的時候會使語法不正確,之前的錯誤 sqltwo and collegename like collegename limit index,pagesize 錯誤的語句,會導致模糊查詢出問題 因為這種寫法編譯過來是錯誤的接下來是修改後的語句 sq...

引數化查詢

一 using system using system.collections.generic using system.linq using system.text using model using system.data.sqlclient using system.data namespac...