常见SQL注入的方法

1、SQL注入步骤
寻找注入点,构造特殊的语句
传入SQL语句可控参数分为两类

  1. 数字类型,参数不用被引号括起来,如?id=1
  2. 其他类型,参数要被引号扩起来,如?name=“phone”
  3. 用户构造SQL语句如:'or 1=1#;
  4. admin’#(这个注入又称PHP的万能密码,是已知用户名的情况下,可绕过输入密码)以后再做解释)

SQL注入实例详解

 <form action="validate.php" method="POST">
        <fieldset >
            <legend>Sql注入演示</legend>
            <table>
                <tr>
                    <td>用户名</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td><input type="text" name="password"></td>
                </tr>
                 <tr>
                     <td><input type="submit" value="提交"></td>
                     <td><input type="reset"  value="重置"></td>
                 </tr>
            </table>
        </fieldset>
    
    </form>
$conn=mysqli_connect("localhost",'root','root')or die("数据库连接失败");
mysqli_select_db($conn,"数据库名")or die("您选择的数据库不存在");
$name=$_POST['username'];
$pwd=md5($_POST['password']);
$sql="select * from users where username='$name' and password='$pwd'";
$query=mysqli_query($conn,$sql);
if($query){
 printf("Error: %s\n",mysqli_error($conn));
}
 //函数从结果集中取得一行作为关联数组,或数字数组
 //判断用户名或密码是否正确
$res=mysqli_fetch_array($query,MYSQLI_ASSOC);
if(is_array($res)){
    header("location:manager.html");
}else{
    echo "您的用户名或密码输入有误,请重新登录!";
}

用户名输入框输入:' or 1=1#,密码随便输入这时候的合成后的SQL查询语句为:

select * from users where username='' or 1=1#' and password=md5('') 

语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username='' or 1=1#' and password=md5('')

等价于

select* from users where usrername='' or 1=1

因为1=1永远都是成立的 即where子句总是为真,将该sql进一步简化之后
等价于select语句:select * from users

你可能感兴趣的:(常见SQL注入的方法)