手把手叫你SQL注入攻防(PHP語法)
阿新 • • 發佈:2019-01-27
閒話不說,直接來!
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