假设我们有以下代码(用于某种搜索或类似的):
$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注入有人可以利用这个吗?
吗?没有。
像复活节彩蛋一样的行为?可能。在这种情况下,如果您不想让用户在搜索中使用通配符,您可以做两件事:
正确的转义通配符(和转义字符),
str_replace(array('''', '%', '_'), array('''''', '''%', '''_'), $str); // or: str_replace(array('|', '%', '_'), array('||', '|%', '|_'), $str); // with SELECT * FROM users WHERE username LIKE ? ESCAPE '|'
或使用
LOCATE(substr, str) > 0
查找精确匹配