是一个mysql LIKE语句,其转义字符串包含未转义通配符'%'(百分比)或'_'(下


Is a mysql LIKE statement with an escaped string containing unescaped wildcards '%' (percent) or '_' (underscore) vulnerable?

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

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

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

我知道用户可以输入%_进行搜索,如果我想让搜索功能正常工作,我应该转义它。(在set_pt的情况下,得到setopt的结果)。

但我的问题是:有人会利用这一点吗?如果是,有人如何利用这一点,如何防止它?下面的函数够吗?

function escape_like_string($str) {
  return str_replace(Array('%', '_'), Array(''%', ''_'), $str);
}

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

有人可以利用这个吗?

sql注入

吗?没有。

像复活节彩蛋一样的行为?可能。在这种情况下,如果您不想让用户在搜索中使用通配符,您可以做两件事:

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

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