SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
什么是合法性的输入数据,就是正常的输入中文英文数字,而',@,#,$,%这样的字符通常就是非合法
<?php
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "select * from user where username = '$username' and password='$password';";
$rs = mysqli_query($conn,$sql);
if($rs->fetch_row()){
echo "成功";
}else{
echo "失败";
}
?>
以上的代码就是接受username和password这两个post进来的数据,将这两条输入插入已经编写好的SQL代码中,达到修改数据库数据的功能。
可是代码中没有对post数据(username和password)进行过滤或者判断,而是直接放进SQL代码中。
通常情况下用户输入的数据应该是username=admin和password=123456,这是SQL代码会变成:
$sql = "select * from user where username='admin' and password='123456'";
那么我们插入的数据就是为username=admin和password=123456。
可是输入的数据不是以上两个数据呢,比如我输入username=admin'#和password=123456,SQL代码会变成:
$sql = "select * from user where username='admin'#' and password='123456'";
这里的#是单行注释符,可以将后边的内容给注释掉。那么此条语句的语义将发生了变化,用户可以不需要判断密码,只需一个用户名,即可完成登录操作,这与开发者的初衷相悖。
我们用select * from a where username='admin' and password='123456';查询发现只有一条,因为符合username='admin'和password='123456的只有一条。
但是,如果我们输入的是select * from a where username='admin' # ' and password='123456';查询的条件就变成了username='admin'这一个条件,而password='123456被#屏蔽了,后面的分号;也被屏蔽了,可以看到下面它还需要我们输入一个;才能结束语句才能搜索。