PHP測試代碼:php
<?php
// 面向對象寫法 $id=addslashes($_GET[‘id’]); //獲取id並轉義預約義字符 // /$id=$_GET[‘id’];
$mysqli=new mysqli(‘localhost’,’root’,’root’,’test’); //鏈接數據庫 指定數據庫 if ($mysqli->connect_errno) { //判斷錯誤信息 die(‘Connect Eroor:’).$mysqli->connect_error(); //斷開鏈接 返回錯誤 }else { if ($id) { $sql=」SELECT * FROM mysqli_test WHERE id=’$id'」; //查詢語句 echo $sql; $mysqli->query(‘set names gbk’); $result=$mysqli->query($sql); //執行一個查詢 //var_dump($result); $date=$result->fetch_assoc(); //得到一個結果集 //var_dump($date); echo 「<br /> username:」.$date[‘username’]; //打印輸出 echo 「<br /> password:」.$date[‘password’]; }else { echo 「Error:ID NULL」; } }
?>
<?php
// 面向過程寫法 // $con=mysql_connect(‘localhost’,’root’,’root’) or die(‘Connect Error:’.mysql_error()); //鏈接數據庫 // mysql_select_db(‘test’,$con);//設置數據庫 // $id=addslashes($_GET[‘id’]); // $sql=」SELECT * FROM mysqli_test WHERE id=’$id'」; // echo $sql; // $result=mysql_query($sql); // $date=mysql_fetch_assoc($result); // echo 「<br />username:」.$date[‘username’]; // echo 「<br />password:」.$date[‘password’]; // //var_dump($date); ?>
當PHP開啓magic_quotes_gpc (魔術引號),或者使用addslashes、mysql_real_escape_string等函數進行過濾時,若是查詢語句中存在單引號,咱們嘗試閉合單引號就會被過濾掉,如圖,經過添加\(轉義符)將單引號轉義mysql
這種形式下,若是數據庫使用的是GB23十二、GBK、GB18030等寬字節的編碼時,就會形成寬字節注入sql
當咱們輸入%df’時通過addslashes轉義變成 %dF%5C%27 在經過GBK編碼後變成 運’數據庫
在這裏咱們發現他多出來了一個單引號正好閉合了咱們查詢語句中的單引號瀏覽器
構造語句:http://127.0.0.1/sqltest.php?id=1%df’and 1=2 union select 1,user(),database() — a(這裏要注意 在mysql註釋符後邊要加一個空格符,因爲瀏覽器在會刪去url末尾中的空格符 因此咱們在後邊加一個字符串 中間加個空格)函數
修復:測試
mysql_real_escape_string轉義fetch
參數化查詢(預編譯)編碼
pdo查詢url