理论补充:1.

                         2.

1.什么是SQL注入,猛戳wikipedia查看

2.本地测试代码:

如果表单提交正确,就打印hello,“username”

否则,打印“404 not found!”

<SPAN style="FONT-SIZE: 18px"><?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></SPAN>  

<?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;</SPAN>  

$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方式吧!