SQL注入漏洞與防範

SQL注入的原理:在原有SQL語句上附加一段SQL代碼,構造特殊的SQL語句,利用程序自身的權限實現所需要的操作。


假如現在有一張user表:

uid username pwd

1 admin admin222

2 custome 123456

現在執行一個登錄操作:

  1. <?php  
  2.     $conn=mysqli_connect("localhost","root","root","test");  
  3.     // 連接數據庫test  
  4.     if (!$conn) {  
  5.         # code...判斷鏈接是否成功  
  6.         echo "連接失敗!";  
  7.         echo mysqli_connect_error();  
  8.         exit();  
  9.     }  
  10.     mysqli_query($conn,"set names utf8");  
  11.     // 指定編碼格式  
  12.     $user = $_GET['user'];
  13.     $pwd = $_GET['pwd'];
  14.     $sql="select * from user where username = '{$user}' and pwd = '{$pwd}'";  
  15.     // sql語句  
  16.     $result=mysqli_query($conn,$sql);  
  17.     // 執行sql語句,將執行結果返回到結果集中  
  18.     $row=mysqli_fetch_array($result);  
  19.     // 從結果集中取得一行作爲數組  
  20.     echo "<pre>";  
  21.     print_r($row);  
  22. ?>  

如上代碼執行的是一個簡單的登錄操作,在瀏覽器中執行這個程序: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;呢?你可以自己試一下,這個你可以得到如下:

uid username pwd

1 admin admin222

2 custome 123456

如果在客戶端訪問:localhost/test/login.php?user=admin&pwd=admin%20or%201=1呢?


直接就繞過了驗證,獲取到了數據庫裏面的admin用戶的信息了。這就是一個簡單的SQL注入。



SQL注入的防範:

(1)如果是整形變量用intval()函數或(int)把所有傳入的參數轉化爲一個數值。

(2)對於字符型變量,用addslashes()把所有'(單引號)、"(雙引號)、\(反斜線)和 (空格)轉爲含有反斜線的字符。

(3)轉義或過濾一些特殊字符,如%等。

(4)做好數據備份。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章