带有包含未转义通配符“%”(百分比)或“_”(下划线)的转义字符串的 mysql LIKE 语句是否容易受到攻击?

Mar*_*ant 5 php mysql escaping wildcard sql-like

假设我们有以下代码(用于某种搜索或类似):

$stmt = $pdo->prepare("SELECT * FROM users WHERE username LIKE ?");
$stmt->execute(array('%' . $username . '%'));
Run Code Online (Sandbox Code Playgroud)

提供的用户名已正确转义,但字符%(= 0 或更多任意字符)和_(= 恰好 1 个任意字符)被 MySQL 解释为通配符。

我知道用户可以输入%或 the_进行搜索,如果我希望搜索功能正常工作,我应该转义它。(在类似的情况下set_pt并获得setopt结果)。

但我的问题是:有人可以利用这个吗?如果是,那么有人会如何利用这一点以及如何防止它?下面的功能够用吗?

function escape_like_string($str) {
  return str_replace(Array('%', '_'), Array('\%', '\_'), $str);
}
Run Code Online (Sandbox Code Playgroud)

我能想到的一种可能性是输入大量的%,因此服务器需要分配大量内存。这行得通吗?

poz*_*ozs 3

有人可以利用这个吗?

用于 SQL 注入?不。

对于类似复活节彩蛋的行为?大概。在这种情况下,如果您不想让用户在此搜索中使用通配符,您可以执行以下两件事:

  1. 正确的转义通配符(和转义字符),

    str_replace(array('\\', '%', '_'), array('\\\\', '\\%', '\\_'), $str);
    // or:
    str_replace(array('|', '%', '_'), array('||', '|%', '|_'), $str);
    // with SELECT * FROM users WHERE username LIKE ? ESCAPE '|'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或用于LOCATE(substr, str) > 0查找精确匹配。