SQL注入(SQLi)
原理:用户输入没做过滤,直接拼进SQL语句,攻击者篡改语句逻辑,读/改/删数据库。
举个最简单例子:
后台代码(危险写法)
$sql = "SELECT * FROM user WHERE username='".$name."' AND password='".$pwd."'";
攻击者用户名输入:
' OR '1'='1
拼接后SQL变成:
SELECT * FROM user WHERE username='' OR '1'='1' AND password='xxx'
‘1’=’1 永远成立 → 不用密码直接登录。
常见类型
1. 联合查询注入 union select
爆库名、表名、列名、数据
?id=1' union select 1,database(),3-- -
2. 布尔盲注
页面只有正常/异常两种状态,逐字符猜数据
3. 时间盲注
用 sleep() 、 benchmark() 延时判断,页面看不出区别
4. 报错注入
利用 updatexml 、 extractvalue 等函数,把数据抛在报错信息里
5. 堆叠注入
; 分号结束当前语句,执行新SQL( ;drop table xxx; )
怎么防御(最重要)
✅ 首选:参数化查询 / 预编译语句(PreparedStatement)
不要字符串拼接!示例(pdo):
$stmt = $pdo->prepare("SELECT * FROM user WHERE username=? AND password=?");
$stmt->execute([$name,$pwd]);
✅ 输入过滤/白名单:允许的字符才放行
✅ 最小权限:数据库账号不要给drop/alter等高权限
✅ 关闭详细数据库报错输出(不要把sql错误抛给前端)
✅ WAF 是辅助,不能代替预编译
一句话总结
凡是把用户输入直接拼到SQL字符串里,几乎都有注入;
解决核心:把数据和SQL代码彻底分开。
© 版权声明
我们提供的源码仅供学习研究之用,严禁用于商业或其他违法用途。任何由此产生的后果与本站无关。此外,请您在使用前自行查毒,并谨慎研究。
THE END









暂无评论内容