PHP SQL注入與防禦

2021-08-17 09:39:36 字數 2940 閱讀 8320

1.什麼是sql注入攻擊?

2.php通用sql注入攻擊方式

登入介面如下:

我們的測試使用者名稱及密碼:admin/123456

①首先,我們使用正確的登入使用者名稱及密碼:

②我們通過sql注入方式跳過密碼驗證登入:

通過兩次登入的sql語句,我們可以很清楚的看出差異

# step 1 sql

select * from users where username = 'admin' and password = 'e10adc3949ba59abbe56e057f20f883e'

# step 2 sql

select * from users where username = 'admin'#' and password = '96e79218965eb72c92a549dd5a330112'

其中第二步由於前台傳入特殊字元單引號(')及#,在資料庫中#為語句注釋部分,則後續sql語句不會被執行,可直接跳過我們的密碼驗證邏輯。

同時,我們也可以通過下面方式跳過邏輯判定

sql語句如下:

select * from users where username = 'admin' or 1='1' and password = '96e79218965eb72c92a549dd5a330112'
同樣,我們使用此種方式可以達到跳過登入驗證的目的

此類問題是未對使用者輸入的特殊字元進行過濾,如單引號('),雙引號("),null等。php可以通過設定開啟magic_quotes_gpc,自動針對特殊字元增加反斜線(\)的方式,對其進行轉義,而避免被程式執行,當然,也可以利用以下方法針對未開啟magic_quotes_gpc時,進行處理:

function addslashes_deep($value)

else

} if(!get_magic_quotes_gpc())

這樣,上述經過處理的sql語句如下:

select * from users where username = 'admin\' or 1=\'1' and password = '96e79218965eb72c92a549dd5a330112'
就不會被解釋執行了

③數字型sql注入攻擊

首先,我們將上面測試**一部分改為如下:

$id = $_get['id'];	

$sql = "select * from users where id=".$id;

$res = $db->query($sql)->fetch_all();

/test.php?id=1 union select 1,username,password,4,5,6,password,8,9,10,11 from users
select * from users where id=1 union select 1,username,password,4,5,6,password,8,9,10,11 from users
我們通過這裡很容易利用union命令,查詢出使用者名稱和密碼等敏感資訊

當然,此類防禦也相當簡單,對於整數型資料,我們在獲取時,需要對其進行轉化如下:

$id = intval($_get['id'])
即可避免此類上述sql注入

3.總結

通過以上兩個示例,在php中,可以通過簡單的三種方法來防禦sql注入:

①對使用者的輸入進行過濾處理後,在進行操作,如:addslashes()方法或者開啟magic_quotes_gpc方法

②針對獲取的數值型資料,進行二次轉換,如intval(),floatval()

③所有需進行資料庫查詢的變數都使用單引號(')包圍,如下:

$sql = "select * from users where username='".$username."'";
4.**:

後台test.php

function pretty_print($array)

function addslashes_deep($value)

else

} if(!get_magic_quotes_gpc())

$db = mysqli_connect('127.0.0.1','root','root','mysqli_test');

$username = $_post['username'];

$password = $_post['password'];

$sql = "select *".

" from users".

" where username = '".$username.

"' and password = '".md5($password)."'";

$res = $db->query($sql)->fetch_row();

if(empty($res))

else

前台index.html

資源參考:

blog:

php SQL注入問題

這次解決sql注入問題,是查詢之前的controller檔案中的sql注入問題,修補漏洞很重要,預防漏洞的產生也同樣重要,在使用sql語句對資料庫進行增刪改查操作的時候,要考慮到sql注入問題的出現。首先了解一下sql注入的步驟 2 使用者自己構造sql語句 3 將sql語句傳送給資料庫管理系統 d...

PHP SQL注入的安全規範

php注入的安全防範通過上面的過程,我們可以了解到php注入的原理和手法,當然我們也同樣可以制定出相應該的防範方法 首先是對伺服器的安全設定,前面的windows伺服器的安全設定我們已經講了,不再重複,這裡主要是php mysql的安全設定和linux主機的安全設定。對php mysql注射的防範,...

SQL注入與防禦技術

sql注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。一 sql注入攻擊的簡單示例。statement select from users where value a variable 上面這條語句是很普通的一條sql語句,...