温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL注入攻击如何检测与防御

发布时间:2026-06-30 23:52:26 来源:亿速云 阅读:93 作者:小樊 栏目:数据库

SQL注入(SQL Injection)是Web安全中最常见、危害最大的漏洞之一。下面从检测防御两个角度系统性地说明。


一、什么是 SQL 注入

攻击者通过在输入中插入或“注入”恶意 SQL 语句,从而:

  • 绕过登录验证
  • 查询、修改、删除数据库数据
  • 获取数据库权限甚至服务器权限

示例(漏洞代码)

SELECT * FROM users WHERE username = '$user' AND password = '$pass';

攻击者输入:

user: admin' --
pass: 任意

最终 SQL 变为:

SELECT * FROM users WHERE username = 'admin' --' AND password = '';

-- 注释掉密码验证,直接登录成功。


二、SQL 注入的检测方法

1. 手工检测

(1)单引号 / 逻辑测试

输入:

' 
' OR '1'='1
' AND 1=1 --
' AND 1=2 --

观察:

  • 页面是否报错
  • 返回结果是否变化

(2)时间盲注

' AND SLEEP(5) --

若页面响应明显变慢,可能存在注入。

(3)报错注入

' AND 1=CONVERT(int, (SELECT @@version)) --

2. 自动化工具检测

常用工具:

  • SQLMap(最常用)
  • Burp Suite(配合插件)
  • AWVS / Nessus
  • OWASP ZAP

示例:

sqlmap -u "http://test.com/page?id=1" --dbs

3. 代码审计(白盒检测)

重点检查:

  • 直接拼接 SQL
  • 未使用参数化查询
  • 动态表名 / 字段名拼接

三、SQL 注入的防御方法(最重要)

✅ 1. 使用参数化查询(最强防御)

这是根本解决方案。

Java(PreparedStatement)

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, pass);

PHP(PDO)

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);

Python(SQLAlchemy)

session.query(User).filter(User.name == username).all()

✅ 参数化查询能把输入当作数据,而不是 SQL 代码


✅ 2. 使用 ORM(对象关系映射)

ORM 框架默认会处理参数绑定:

  • Hibernate
  • MyBatis(需正确使用 #{}
  • Django ORM
  • SQLAlchemy

⚠️ 注意:ORM 中仍可能写原生 SQL,需谨慎。


✅ 3. 输入验证与白名单

  • 对参数类型、长度、格式进行校验
  • 对表名、字段名使用白名单
if (!allowedColumns.contains(column)) {
    throw new IllegalArgumentException();
}

✅ 4. 最小权限原则

  • 数据库账号只给必要权限
  • Web 应用数据库账号:
    • 禁止 DROPFILESUPER
    • 禁止访问系统表

✅ 5. 错误信息不暴露给前端

  • 关闭数据库错误回显
  • 使用统一错误页面

✅ 6. WAF(辅助防御)

  • 部署 Web 应用防火墙
  • 可拦截常见注入特征

⚠️ WAF 是辅助手段,不是根本解决方案


四、常见误区(一定要避免)

❌ 只过滤单引号
❌ 用黑名单(如 replace ', ""
❌ 认为前端校验就够了
❌ 认为 HTTPS 能防 SQL 注入


五、总结(核心要点)

项目 说明
最有效防御 参数化查询 / 预编译语句
次要防御 ORM + 输入验证 + 最小权限
检测方式 手工测试 + SQLMap + 代码审计
不能依赖 WAF、前端校验、黑名单

如果你愿意,我可以:

  • 帮你分析一段代码是否存在 SQL 注入
  • 给你一个完整的漏洞 + 修复示例
  • 针对 Java / PHP / Python 给出具体防御模板
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI