先舉一個例子來給大家了解一下php下的注入的特殊性和原理。當然,這個例子也可以告訴大家如何學習構造有效的SQL語句。
我們拿一個用戶驗證的例子,首先建立一個數據庫和一個數據表并插入一條記錄,如下:
PHP代碼:
CREATE TABLE `user` (
`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default '',
`passWord` varchar(20) NOT NULL default '',
PRIMARY KEY (`userid`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
#
# 導出表中的數據 `user`
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
驗證用戶文件的代碼如下:
PHP代碼:
<?php
$servername = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "injection";
MySQL_connect($servername,$dbusername,$dbpassword) or die ("數據庫連接失敗");
$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);
if (empty($userinfo)){
echo "登陸失敗";
} else {
echo "登陸成功";
}
echo "<p>SQL Query:$sql<p>";
?>
這時我們提交:
就會返回:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:wwwinjectionuser.php on line 13
登陸失敗
SQL Query:SELECT * FROM user WHERE username='angel' or 1=1' AND password='
PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:wwwinjectionuser.php on line 13
看到了嗎?單引號閉合后,并沒有注釋掉后面的單引號,導致單引號沒有正確配對,所以由此可知我們構造的語句不能讓Mysql正確執行,要重新構造: 這時顯示“登陸成功”,說明成功了?;蛘咛峤唬?BR>* 這樣就把后面的語句給注釋掉了!說說這兩種提交的不同之處,我們提交的第一句是利用邏輯運算,在asp中運用可以說是非常廣泛的,這個不用說了吧?第二、三句是根據mysql的特性,mysql支持/*和#兩種注釋格式,所以我們提交的時候是把后面的代碼注釋掉,值得注意的是由于編碼問題,在IE地址欄里提交#會變成空的,所以我們在地址欄提交的時候,應該提交%23,才會變成#,就成功注釋了,這個比邏輯運算簡單得多了,由此可以看出PHP比ASP強大靈活多了。
新聞熱點
疑難解答