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)
前台index.htmlfunction 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
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語句,...