1. 程式人生 > >手把手叫你SQL注入攻防(PHP語法)

手把手叫你SQL注入攻防(PHP語法)

閒話不說,直接來!

2.本地測試程式碼:

如果表單提交正確,就列印hello,“username”

否則,列印“404 not found!”

<?php 
	require 'config.php';
	$DBConnection = mysql_connect ( "$dbhost", "$dbuser", "$dbpwd" );
	mysql_select_db ( "$dbdatabase" );
	
    if(isset($_GET['submit']) && $_GET['submit']){    
	$sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
	//echo $sql;exit;
	$result=mysql_query($sql,$DBConnection);	
	$num=mysql_num_rows($result);		
	if($num>=1)
	{
		echo "hello,".$_GET['username'];
	}
	else {
		echo"404 not found";
	}
}
?>
<form action="login.php" method="GET">
<table>
	<tr>
		<td>username</td>
		<td><input type="textbox" name="username"/></td>
		<td>password</td>
		<td><input type="textbox" name="password"></td>
		<td>submit</td>
		<td><input type="submit" name="submit"></td>
	</tr>
</table>
</form>

3.瀏覽器介面顯示:


4.重頭戲,sql注入:




5.原理--為什麼使用者名稱不正確,卻可以顯示hello?

我可以echo一下:

$sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
echo $sql;exit;

顯示:



拿到我的mysql資料庫中查詢:



可以看到,居然能查到資訊,因為sql語句中,前一半單引號被閉合,後一半單引號被 “--”給註釋掉,中間多了一個永遠成立的條件“1=1”,這就造成任何字元都能成功登入的結果。

6.小結:

1)其實這個sql注入過程上很簡單,困難的地方在於提交SQL注入語句的靈活性上面,單引號的使用很關鍵,另外,多用echo列印除錯也很值得一試~~

2)GET方式提交表單很危險,所以還是用POST方式吧!

3)防止SQL注入:可以看出,sql注入就是使用者提交一些非法的字元(如本文的單引號’和sql語句的註釋號--,還有反斜槓\等),所以要用轉義:  htmlspecialchars函式,mysql_read_escape_string函式都可以實現。

4)JS段驗證表單了,JSP/PHP等後臺還要驗證碼?

     ---需要,因為friebug可以禁用JS...

--------------------------------------------------------------------------

update:

上面的方法,當password通過md5加密的話,就無法實現注入了,那麼就在username上做手腳:


username後面的內容就都被註釋掉了。哈哈~

by wusuopuBUPT