一、理解SQL注入攻击本质
SQL注入是通过将恶意SQL代码插入输入参数,欺骗服务器执行非预期命令的攻击方式。典型攻击模式包括:
- 联合查询注入:通过UNION获取其他表数据
- 布尔盲注:根据页面响应判断SQL执行结果
- 报错注入:利用数据库错误信息获取数据
-- 典型注入示例
SELECT FROM users WHERE username = 'admin'--' AND password = '...'
二、核心防御技术方案
1. 参数化查询(预编译语句)
所有主流语言都支持参数化查询,这是最有效的防护手段:
Python示例
cursor.execute("SELECT FROM users WHERE username = %s AND password = %s",
(username, password))
2. 使用ORM框架
现代ORM框架自动处理参数转义:
// Hibernate示例
Query query = session.createQuery("FROM User WHERE username = :username");
query.setParameter("username", userInput);
3. 输入验证与白名单
- 验证数据类型(数字/字符串等)
- 使用正则表达式限制输入格式
- 对特殊字符进行转义处理
4. 最小权限原则
数据库账户应遵循:
-- 创建专用账户
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON app_db. TO 'webapp'@'localhost';
三、进阶防护措施
5. Web应用防火墙(WAF)配置
推荐规则:
- 拦截包含SQL关键字(DROP, UNION等)的请求
- 检测异常长的参数值
- 屏蔽常见注入模式(如1=1)
6. 定期安全审计
实施方法:
- 使用sqlmap等工具进行渗透测试
- 审查所有数据库交互代码
- 启用数据库审计日志
7. 错误处理机制
关键原则:
// 错误示例(泄露数据库结构)
catch (PDOException $e) {
die("SQL Error: ".$e->getMessage());
}
// 正确做法
catch (PDOException $e) {
log_error($e);
show_generic_error();
}
四、应急响应方案
若发现注入攻击:
- 立即隔离受影响系统
- 分析攻击入口点
- 重置所有数据库凭证
- 检查数据完整性
- 升级防护措施
评论