標籤:
SQL注入原理:就是通過把SQL命令插入到Web表單遞交或輸入欄位名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。
以下介紹SQL注入方式:
首先建表如下:
1 create database sqltest charset utf82 3 create table test (4 id int,5 name varchar(10),6 age tinyint unsigned
7 )engine=myisam charset=utf8
插入資料如下
我們分成欄位為數實值型別和字串類型兩種方式進行測試:
一、下面開始測試欄位為數實值型別時的sql注入,sql語句:
1 $id= $_GET[‘tid‘];2 $sql = "select * from test where id = $id";
尋找id為1的記錄,在瀏覽器中輸入並執行如下
可以看到,此時只查詢到1條記錄,查詢結果上面顯示的是自動拼接好的sql字串。繼續,將瀏覽器URL中的tid=1 換成tid=1 or 1=1測試,結果如下
此時所有的記錄都被查出來了,這是針對欄位為數實值型別時 的sql注入方式,為了避免被注入我們可以將代碼:
$id= $_GET[‘tid‘];
改成如下:
$id= $_GET[‘tid‘] + 0;
原理:當資料庫中欄位為數實值型別時,不管你的參數多麼險惡,+0後都老老實實變成數實值型別。
二、測試欄位為數實值型別時的sql注入,sql語句:
$name = $_GET[‘name‘];$sql1 = "select * from test where name = ‘$name‘";
尋找name為test1的記錄,在瀏覽器中輸入並執行如下:
只查到一條記錄,這是正確的。現在把URL中 name=test1 換成 name=test1‘ or 1=1--‘ 測試如下:
所有記錄都被查出來了。從顯示的sql語句可以看出where後面的運算式 name = ‘test1‘ or 1=1--‘ 恒為真(--將其後面的字串都省略掉)
針對上面的sql注入 我們可以通過將瀏覽器中接受來的字元轉義的方式避免,在php中 可以採用魔術引號的方法,將PHP.ini檔案中的參數magic_quotes_gpc置為ON
例如: 瀏覽器中name = test1‘ or 1=1--‘,經過轉義後得到的sql字串變為:
select * from test where name = ‘test1\‘ or 1=1--\‘‘
重新查詢變為:
這時查不到任何結果,字串的引號是成對出現的,經過轉義後 sql 把test\‘ or 1=1--\‘作為一個字串,而不是像上述把 ‘test‘ 作為一個字串。
這隻是最簡單的sql注入,更深的後面再研究吧
PHP中 簡單的SQL注入分析