“数据库被注入”通常指数据库遭受注入攻击(最典型的是 SQL 注入),本质原因是:程序把“用户传入的数据”当成了“可执行的数据库指令”来处理。
下面从原因、原理、常见场景、防护四个角度说明。
攻击者可以输入特殊字符(如 '、;、--、or 1=1):
用户名:admin' --
密码:随意
错误示例(Java / PHP 常见):
String sql = "SELECT * FROM user WHERE name='" + username + "' AND pwd='" + password + "'";
如果 username = admin' --
最终 SQL 变成:
SELECT * FROM user WHERE name='admin' -- ' AND pwd='xxx'
-- 注释掉后面内容,直接登录成功。
and 1=1 / and 1=2| 场景 | 问题 |
|---|---|
| 登录框 | 拼接用户名密码 |
| 搜索框 | 直接拼 LIKE |
| 订单 ID | 直接拼 WHERE id= |
| 后台接口 | 信任前端参数 |
| 老系统 | 无参数化、无 WAF |
Java:
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM user WHERE name=? AND pwd=?");
ps.setString(1, username);
ps.setString(2, password);
MyBatis:
<select id="login">
SELECT * FROM user WHERE name=#{name}
</select>
#{}安全,${}危险
rootSELECT/INSERT数据库被注入,不是数据库的问题,而是“代码把用户输入当成了命令”。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。