mysql中如何防止SQL注入

使用预处理语句可有效防止SQL注入,其通过将SQL结构与参数分离,确保用户输入不被当作代码执行,推荐结合参数化查询与最小权限原则以增强安全性。

防止SQL注入的关键在于避免将用户输入直接拼接到SQL语句中。在MySQL中,最有效的方式是使用预处理语句(Prepared Statements)配合参数化查询。这种方式能确保用户输入的数据被当作参数处理,而不是SQL代码的一部分。

使用预处理语句(推荐方式)

预处理语句会先将SQL结构发送给数据库解析,再传入参数值,从而隔离代码与数据。

以PHP的PDO为例:

$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch();

使用命名参数更清晰:

$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->bindParam(':email', $email);
$stmt->execute();

对输入进行过滤和验证

虽然不能替代预处理,但合理的输入检查可增加安全性。

  • 验证数据类型,如邮箱是否符合格式
  • 限制输入长度,避免超长字符串
  • 使用白名单机制,比如只允许特定字符或选项

避免拼接SQL字符串

以下写法非常危险,应严格禁止:

"SELECT * FROM users WHERE id = " . $_GET['id']

攻击者可通过传入 1 OR 1=1 获取所有数据。即使使用转义函数(如mysqli_real_escape_string),也不能完全防御复杂场景下的注入。

最小权限原则

数据库账户应遵循最小权限原则。Web应用连接数据库的账号不应拥有DROP、CREATE等高危权限,即使发生注入,也能降低危害。

基本上就这些。只要坚持使用预处理语句,大多数SQL注入风险都能有效避免。