MySQL 中使用 LIKE 语句时如何安全过滤后参数?

MySQL 中使用 LIKE 语句时如何安全过滤后参数?
最新回答
快乐很简单

2020-10-15 00:44:57

在 MySQL 中使用 LIKE 语句时,直接拼接用户输入的参数可能导致 SQL 注入攻击,尤其是当参数中包含 %、_ 等通配符时。以下是安全过滤参数的方法和示例:

核心解决方案
  1. 使用参数化查询(预处理语句)通过预处理语句(如 PreparedStatement)将用户输入作为参数绑定,避免拼接 SQL 字符串。这是最安全的方式。

    示例(PHP PDO)

    $stmt = $pdo->prepare("SELECT * FROM projects WHERE name LIKE :keyword");$keyword = "%" . $userInput . "%";$stmt->bindParam(':keyword', $keyword);$stmt->execute();
  2. 手动转义特殊字符若无法使用预处理语句,需对 %、_、 等字符进行转义(在字符前加 ),并使用 ESCAPE 子句明确转义符。

    示例

    SELECT * FROM projects WHERE name LIKE '%项目_好%' ESCAPE '';

    这里 _ 表示转义后的下划线,ESCAPE '' 指定反斜杠为转义符。

  3. 过滤输入中的通配符若业务允许,直接移除或替换用户输入枝辩中的 % 和 _:

    $filteredInput = str_replace(['%', '_'], '', $userInput);$sql = "SELECT * FROM projects WHERE name LIKE '%$filteredInput%'";
错误示例与修正
  • 错误做法(直接拼接):

    -- 危险!用户输入可能包含恶意字符SELECT * FROM projects WHERE name LIKE '%$userInput%';
  • 修正为参数化查询

    // Java 示例String sql = "SELECT * FROM projects WHERE name LIKE ?";PreparedStatement stmt = connection.prepareStatement(sql);stmt.setString(1, "%" + userInput + "%"脊圆);
关键注意事项
  1. 优先使用预处理语句参数化查询能彻底避免 SQL 注入,无需手动处理特殊字符。

  2. 明确转义规则若猛野缺手动转义,确保 ESCAPE 子句与转义符一致(如 ESCAPE '!' 对应 !%、!_)。

  3. 最小权限原则数据库用户应仅具备必要权限,限制攻击者利用注入后的操作范围。

总结
  • 最佳实践:始终使用预处理语句。
  • 替代方案:转义通配符或过滤输入(需结合业务场景)。
  • 避免:直接拼接未处理的用户输入到 LIKE 语句中。

通过以上方法,可有效防止因 LIKE 参数导致的 SQL 注入风险。