防止 SQL 注入(SQL Injection)是数据库与系统安全中最基本、也最重要的一环。下面从原理 → 防护措施 → 最佳实践三个层面说明。
SQL 注入的本质是:
用户输入被当作 SQL 代码执行,而不是数据
示例(危险写法):
"SELECT * FROM user WHERE name = '" + username + "'"
如果用户输入:
' OR '1'='1
最终 SQL 变成:
SELECT * FROM user WHERE name = '' OR '1'='1'
→ 绕过认证,泄露数据。
这是最有效、最根本的方法
String sql = "SELECT * FROM user WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
cursor.execute(
"SELECT * FROM user WHERE name = %s",
(username,)
)
<select id="getUser">
SELECT * FROM user WHERE name = #{name}
</select>
❌ 不要用 ${name}(字符串拼接)
ORM 默认使用参数化查询:
✅ 减少手写 SQL
❌ 不要拼接 SQL 字符串
即使使用参数化,也建议:
if (!sortField.matches("^(id|name|time)$")) {
throw new IllegalArgumentException();
}
数据库账号只给必要权限:
❌ 错误示例:
EXEC('SELECT * FROM user WHERE name = ''' + @name + '''')
❌ 字符串拼接 SQL
❌ 前端校验代替后端校验
❌ 使用 ${} 代替 #{}
❌ 把用户输入直接拼进 ORDER BY / LIMIT
❌ 认为“转义一下就够了”
防 SQL 注入 = 参数化查询 + 最小权限 + 输入校验
如果你愿意,可以告诉我:
我可以帮你具体改代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。