5

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

$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);
}

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

4

1 回答 1

3

有人可以利用这个吗?

对于 SQL 注入?不。

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

  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查找完全匹配。

于 2013-03-18T12:17:13.520 回答