2021-05-06 sql

本文探讨了SQL注入攻击的原理,通过示例展示了如何利用非法输入绕过正常验证,执行非授权查询。当web应用未对用户输入数据进行过滤或验证时,攻击者可以插入特殊字符如'#'来改变SQL语句的含义,导致安全风险。例如,输入'admin'#'可使密码检查失效,允许未授权登录。为防止此类攻击,开发者应确保对所有用户输入进行适当的转义或使用参数化查询。
摘要由CSDN通过智能技术生成

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被#屏蔽了,后面的分号;也被屏蔽了,可以看到下面它还需要我们输入一个;才能结束语句才能搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值