SQL 注入(SQL Injection)是一种常见且高危的 Web 安全漏洞。防范 SQL 注入的核心思想是:永远不要信任用户输入,并严格区分代码与数据。下面从原则、技术手段、开发规范、示例等方面系统说明。
参数化查询是防止 SQL 注入最可靠的方法。
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
cursor.execute("SELECT * FROM user WHERE id = %s", (user_id,))
❌ 错误示例
sql = f"SELECT * FROM user WHERE id = {user_id}"
ORM 自动处理参数绑定,大多数情况下是安全的。
| 语言 | 框架 |
|---|---|
| Java | MyBatis(用 #{})、JPA / Hibernate |
| Python | SQLAlchemy、Django ORM |
| PHP | Eloquent(Laravel) |
| Node.js | Sequelize、TypeORM |
✅ MyBatis 正确写法:
<select id="getUser">
SELECT * FROM user WHERE id = #{id}
</select>
❌ 错误写法:
SELECT * FROM user WHERE id = ${id}
存储过程本身不等于安全,只有在参数化调用时才安全。
if (id instanceof Integer) {
...
}
if (!Arrays.asList("asc", "desc").contains(order)) {
throw new IllegalArgumentException();
}
❌ 用户输入 → SQL
✅ 用户输入 → 参数 → SQL
SELECT / INSERT / UPDATE / DELETE❌ 禁止:You have an error in your SQL syntax
✅ 返回:系统异常,请联系管理员
input.replace("'", "")
❌ 容易被绕过(编码、大小写、数据库特性)
前端校验 完全不可信
审查以下高风险点:
ORDER BY / LIMIT 参数能参数化就参数化,能 ORM 就 ORM,永远不拼接用户输入。
如果你愿意,我可以:
只要把场景或代码贴出来即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。