SQL注入漏洞與防範
SQL注入的原理:在原有SQL語句上附加一段SQL程式碼,構造特殊的SQL語句,利用程式自身的許可權實現所需要的操作。
假如現在有一張user表:
uidusernamepwd
1adminadmin222
2custome123456
現在執行一個登入操作:
- <?php
- $conn=mysqli_connect("localhost","root","root","test");
- // 連線資料庫test
- if (!$conn) {
- # code...判斷連結是否成功
- echo"連線失敗!";
-
echo
- exit();
- }
- mysqli_query($conn,"set names utf8");
- // 指定編碼格式
- $user = $_GET['user'];
-
$pwd = $_GET['pwd'];
- $sql="select * from user where username = '{$user}' and pwd = '{$pwd}'";
- // sql語句
- $result=mysqli_query($conn,$sql);
-
// 執行sql語句,將執行結果返回到結果集中
- $row=mysqli_fetch_array($result);
- // 從結果集中取得一行作為陣列
- echo"<pre>";
- print_r($row);
- ?>
如上程式碼執行的是一個簡單的登入操作,在瀏覽器中執行這個程式:localhost/test/login.php?user=admin&pwd=admin222,執行的SQL語句相當於:select * from user where username= 'admin' and pwd = 'admin222',將會得到執行結果。
如果請求:localhost/test/login.php?user=admin&pwd=admin,由於密碼與使用者名稱不匹配導致沒有任何查詢結果。即:SQL語句:select * from user where username= 'admin' and pwd = 'admin'是查詢不到結果的。那麼,如果是SQL語句:select
* from user where username= 'admin' and pwd = 'admin' or 1 = 1;呢?你可以自己試一下,這個你可以得到如下:
uidusernamepwd
1adminadmin222
2custome123456
如果在客戶端訪問:localhost/test/login.php?user=admin&pwd=admin%20or%201=1呢?直接就繞過了驗證,獲取到了資料庫裡面的admin使用者的資訊了。這就是一個簡單的SQL注入。
SQL注入的防範:
(1)如果是整形變數用intval()函式或(int)把所有傳入的引數轉化為一個數值。
(2)對於字元型變數,用addslashes()把所有'(單引號)、"(雙引號)、\(反斜線)和 (空格)轉為含有反斜線的字元。
(3)轉義或過濾一些特殊字元,如%等。
(4)做好資料備份。。。