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等函數進行過濾時,如果查詢語句中存在單引號,我們嘗試閉合單引號就會被過濾掉,如圖,通過添加\(轉義符)將單引號轉義
這種形式下,如果數據庫使用的是GB2312、GBK、GB18030等寬字節的編碼時,就會造成寬字節注入
當我們輸入%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轉義
參數化查詢(預編譯)
pdo查詢