SQL注入(SQL Injection)是一种常见的Web安全漏洞攻击,其核心原理是 攻击者通过在应用程序的输入中插入恶意的SQL代码,欺骗后端数据库执行非预期的操作。
下面从原理、过程、示例和防御几个方面说明。
大多数Web应用都会用SQL语句与数据库交互,例如:
SELECT * FROM users WHERE username = 'admin' AND password = '123456';
如果程序直接把用户输入拼接到SQL语句中,而没有做任何安全处理,攻击者就可以构造特殊输入,改变SQL语句的逻辑。
后端代码(伪代码):
String sql = "SELECT * FROM users WHERE username = '"
+ username + "' AND password = '"
+ password + "'";
用户输入:
用户名:admin
密码:123456
生成的SQL:
SELECT * FROM users WHERE username = 'admin' AND password = '123456';
✅ 正常执行
攻击者输入:
用户名:admin' --
密码:(随便填)
生成的SQL变成:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx';
-- 在SQL中是注释符,后面的内容被忽略。
✅ 攻击者无需密码即可登录
SQL注入的危害非常大,常见包括:
xp_cmdshell)✅ 未对用户输入做任何校验或转义
✅ 使用字符串拼接构造SQL语句
✅ 过度信任前端传来的数据
| 类型 | 说明 |
|---|---|
| 联合查询注入 | 使用 UNION 查询其他表数据 |
| 布尔盲注 | 通过真假判断推断数据 |
| 时间盲注 | 通过延时判断数据 |
| 报错注入 | 利用数据库报错回显信息 |
| 堆叠注入 | 执行多条SQL语句 |
PreparedStatement(Java)
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
✅ 数据库会把输入当成数据,而不是SQL指令
如:
#{})❌ 避免拼接SQL
root / saDROP、xp_cmdshell 等危险操作SQL注入的本质是:把用户输入当成SQL代码执行了。
防御的核心:永远不要相信用户输入,使用参数化查询。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。