一、SQL注入的原理与危害
攻击者通过构造恶意SQL语句插入用户输入参数,欺骗服务器执行非预期数据库操作。成功利用可导致:
- 数据泄露(用户凭证、敏感信息)
- 数据库篡改(数据删除/篡改)
- 权限提升(获取管理员权限)
- 服务器沦陷(通过数据库执行系统命令)
二、核心防御方案
1. 参数化查询(预编译语句)
最有效的防护手段,SQL语句与参数分离:
Python示例(使用psycopg2)
cursor.execute(
"SELECT FROM users WHERE username = %s AND password = %s",
(username, password) 参数自动转义
)
2. 输入验证与白名单过滤
- 验证数据类型(数字/字符串/日期格式)
- 长度限制(防止超长恶意语句)
- 正则表达式白名单(如仅允许字母数字)
3. 最小权限原则
数据库账户应:
- 仅授予必要表的读写权限
- 禁止使用SA/root等超级账户
- 单独设置只读账户用于查询
4. ORM框架安全使用
现代ORM(如Hibernate、Django ORM)自动处理参数转义:
// Hibernate示例
Query query = session.createQuery(
"FROM User WHERE email = :email");
query.setParameter("email", userInput);
注意:避免直接拼接HQL/EL表达式
5. 存储过程安全调用
通过预定义存储过程限制动态SQL:
-- SQL Server示例
CREATE PROCEDURE GetUser
@Username NVARCHAR(50)
AS
BEGIN
SELECT FROM Users WHERE Username = @Username
END
6. 错误信息处理
- 生产环境关闭详细数据库错误
- 自定义统一错误页面
- 日志记录完整错误(仅限管理员查看)
7. 定期安全审计
- 使用SQLMap等工具进行渗透测试
- 代码审查重点关注动态SQL拼接
- 更新数据库补丁(如CVE-2022-31245)
三、进阶防护措施
- Web应用防火墙(WAF):配置SQL注入规则集
- 数据库审计:监控异常查询行为
- 加密敏感字段:即使数据泄露也无法直接读取
通过组合应用以上策略,可有效将SQL注入风险降低至可接受水平。安全防护需要持续改进,建议每季度进行安全评估。
评论