SQL注入(SQL Injection)是Web安全中最常见、危害最大的漏洞之一。下面从检测和防御两个角度系统性地说明。
攻击者通过在输入中插入或“注入”恶意 SQL 语句,从而:
示例(漏洞代码)
SELECT * FROM users WHERE username = '$user' AND password = '$pass';
攻击者输入:
user: admin' --
pass: 任意
最终 SQL 变为:
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
-- 注释掉密码验证,直接登录成功。
输入:
'
' OR '1'='1
' AND 1=1 --
' AND 1=2 --
观察:
' AND SLEEP(5) --
若页面响应明显变慢,可能存在注入。
' AND 1=CONVERT(int, (SELECT @@version)) --
常用工具:
示例:
sqlmap -u "http://test.com/page?id=1" --dbs
重点检查:
这是根本解决方案。
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, pass);
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
session.query(User).filter(User.name == username).all()
✅ 参数化查询能把输入当作数据,而不是 SQL 代码
ORM 框架默认会处理参数绑定:
#{})⚠️ 注意:ORM 中仍可能写原生 SQL,需谨慎。
if (!allowedColumns.contains(column)) {
throw new IllegalArgumentException();
}
DROP、FILE、SUPER⚠️ WAF 是辅助手段,不是根本解决方案
❌ 只过滤单引号
❌ 用黑名单(如 replace ', "")
❌ 认为前端校验就够了
❌ 认为 HTTPS 能防 SQL 注入
| 项目 | 说明 |
|---|---|
| 最有效防御 | 参数化查询 / 预编译语句 |
| 次要防御 | ORM + 输入验证 + 最小权限 |
| 检测方式 | 手工测试 + SQLMap + 代码审计 |
| 不能依赖 | WAF、前端校验、黑名单 |
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。