关于sql注入

关于sql注入

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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容