欢迎扫码,加作者微信

Web安全攻防:SQL注入漏洞原理与防御终极指南

2026-02-11 14:30:00
2026-02-11 14:30:00

一、 漏洞原理

SQL 注入(SQL Injection)发生的原因是后端代码将用户输入的数据当做了 SQL 代码的一部分执行

考虑以下登录代码(Java JDBC 示例):


// ❌ 错误示范:字符串拼接
String query = "SELECT * FROM users WHERE username = '" + user + "' AND password = '" + pass + "'";
statement.execute(query);

如果攻击者输入用户名为:admin' --,生成的 SQL 语句将变成:


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

由于 -- 在 SQL 中表示注释,后面的密码验证被完全忽略,攻击者无需密码即可登录。

二、 常见攻击方式

  • 布尔盲注 (Boolean-based Blind):通过页面返回的 True/False 判断数据。
  • 联合查询注入 (UNION query):使用 UNION 操作符将结果合并。
  • 报错注入 (Error-based):诱导数据库抛出包含敏感信息的错误详情。

三、 如何防御?

1. 使用预编译语句 (Prepared Statements)

这是防御 SQL 注入最有效的方法。数据库会将 SQL 模板和数据分开处理。


// ✅ 正确示范
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, user);
pstmt.setString(2, pass);
pstmt.executeQuery();

2. 最小权限原则

不要使用 rootsa 账号连接 Web 数据库。为应用程序创建受限的数据库账号。

文章目录
Copyright © 2026 湘ICP备2025142407号
🎉 今日第 1 位访客 📊 年访问量 0 💝 累计赞赏 1000+