SQL注入的原理:在原有SQL語句上附加一段SQL程式碼,建構特殊的SQL語句,利用程式本身的權限實作所需的操作。
假如現在有一張user表:
uidusernamepwd
#1adminadmin222
2custome123456
現在執行一個登入動作:
#2custome123456
- 現在執行一個登入動作:
<?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['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 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中文網其他相關文章!