基于PHP的SQL注入详解

本文详细解释了SQL注入的概念,展示了如何利用单引号、括号等进行注入攻击,并探讨了常见的SQL注入解决方案,包括使用图形验证码、预处理语句(如PDO和MySQLi)以及对用户输入进行过滤和转义处理。
摘要由CSDN通过智能技术生成
什么是SQL注入?

就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
例如一个简单的登录表单(这里把密码写成明文方便说明):
这里写图片描述
当在表单中填写这样的语句进行提交登录时会出现这样的SQL语句

select * from t_admin where admin_name='xxx' and admin_pwd='xxx'' or '1'

这样会查询出所有的用户信息,所有存在不安全隐患

常用的SQL注入方式

下面看看一些常用例测试的SQL注入语句。

1. 使用单引号及or关键字
SELECT * FROM Users WHERE Username='$username' AND Password='$password' 


我们针对上面的SQL语句分析,发现如果用下面的测试数据就能够进行SQL注入了
引用
username=1or1=1 password=1’or’1’=’1

看看整个SQL查询语句变成:
引用

SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1' 


假设参数值是通过GET方法传递到服务器的,且域名为www.example.com 那么我们的访问请求就是:
引用

  http://www.example.com/index.php?username=1‘%20or%20’1’%20=%20’1password=1’%20or%20’1’%20=%20’1

 对上面的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。

2. 使用括号



另外一个查询的例子如下: 引用

 SELECT * FROM Users WHERE((Username='$username')AND(Password=MD5('$password'))) 


在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,我们很容找出缺少的右括号解决,对于第二个问题,我们可以想办法使第二个条件失效。我们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是–),也就是说,我们用如下的用户名和密码:
引用
username=1or

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值