2020-10-15 00:44:57
在 MySQL 中使用 LIKE 语句时,直接拼接用户输入的参数可能导致 SQL 注入攻击,尤其是当参数中包含 %、_ 等通配符时。以下是安全过滤参数的方法和示例:
核心解决方案使用参数化查询(预处理语句)通过预处理语句(如 PreparedStatement)将用户输入作为参数绑定,避免拼接 SQL 字符串。这是最安全的方式。
示例(PHP PDO):
$stmt = $pdo->prepare("SELECT * FROM projects WHERE name LIKE :keyword");$keyword = "%" . $userInput . "%";$stmt->bindParam(':keyword', $keyword);$stmt->execute();手动转义特殊字符若无法使用预处理语句,需对 %、_、 等字符进行转义(在字符前加 ),并使用 ESCAPE 子句明确转义符。
示例:
SELECT * FROM projects WHERE name LIKE '%项目_好%' ESCAPE '';这里 _ 表示转义后的下划线,ESCAPE '' 指定反斜杠为转义符。
过滤输入中的通配符若业务允许,直接移除或替换用户输入枝辩中的 % 和 _:
$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 + "%"脊圆);优先使用预处理语句参数化查询能彻底避免 SQL 注入,无需手动处理特殊字符。
明确转义规则若猛野缺手动转义,确保 ESCAPE 子句与转义符一致(如 ESCAPE '!' 对应 !%、!_)。
最小权限原则数据库用户应仅具备必要权限,限制攻击者利用注入后的操作范围。
通过以上方法,可有效防止因 LIKE 参数导致的 SQL 注入风险。