防止 SQL 注入(SQL Injection)的核心原则是:永远不要把用户输入直接拼接到 SQL 语句中。下面从“原则 → 具体手段 → 开发实践”系统说明。
这是防 SQL 注入最有效、必须使用的手段。
❌ 错误写法(拼接):
"SELECT * FROM user WHERE name = '" + username + "'"
✅ 正确写法(参数化):
PreparedStatement ps =
conn.prepareStatement("SELECT * FROM user WHERE name = ?");
ps.setString(1, username);
不同语言的示例:
cursor.execute("SELECT * FROM user WHERE name = %s", (username,))
$stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?");
$stmt->execute([$name]);
✅ 原理:参数和 SQL 语句分离,数据库不会把参数当 SQL 执行。
使用成熟的 ORM 可大幅降低风险:
#{} 而不是 ${})⚠️ 注意:
#{} 安全,${} 危险参数化是基础,输入校验是第二道防线。
例如:
id / time / nameif (!Arrays.asList("id","time").contains(sort)) {
sort = "id";
}
数据库账号权限越小越好:
SELECT / INSERT / UPDATEDROP / FILE / EXECUTE即使被注入,破坏范围也有限。
❌ 以下方式极易导致注入:
ORDER BY ${col})eval / exec 执行 SQL✅ 动态表名处理:
参数化查询 + 输入校验 + 最小权限 = 防 SQL 注入的铁三角
如果你愿意,我可以:
你可以直接把代码贴出来。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。