首頁  >  文章  >  後端開發  >  SQL注入漏洞與防範詳解

SQL注入漏洞與防範詳解

小云云
小云云原創
2018-03-14 14:42:082097瀏覽

SQL注入的原理:在原有SQL語句上附加一段SQL程式碼,建構特殊的SQL語句,利用程式本身的權限實作所需的操作。

假如現在有一張user表:

uidusernamepwd

#1adminadmin222

2custome123456

現在執行一個登入動作:

#2custome123456
  1. 現在執行一個登入動作:

<?php  
    $conn=mysqli_connect("localhost","root","root","test");  
    // 连接数据库test  
    if (!$conn) {  
        # code...判断链接是否成功  
        echo "连接失败!";  
        echo mysqli_connect_error();  
        exit();  
    }  
    mysqli_query($conn,"set names utf8");  
    // 指定编码格式  
    $user = $_GET[&#39;user&#39;];
    $pwd = $_GET[&#39;pwd&#39;];
    $sql="select * from
 user where username = &#39;{$user}&#39; and pwd = &#39;{$pwd}&#39;";  
    // sql语句  
    $result=mysqli_query($conn,$sql);  
    // 执行sql语句,将执行结果返回到结果集中  
    $row=mysqli_fetch_array($result);  
    // 从结果集中取得一行作为数组  
    echo "<pre class="brush:php;toolbar:false">";  
    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()把所有'(單引號)、"(雙引號)、\(反斜線)和(空格)轉為含有反斜線的字符。

php關於反序列化物件注入漏洞

分享五個著名的SQL注入漏洞掃描工具

php防止sql注入漏洞程式碼

以上是SQL注入漏洞與防範詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn