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)
我能想到的一种可能性是输入大量的%,因此服务器需要分配大量内存。这行得通吗?
有人可以利用这个吗?
用于 SQL 注入?不。
对于类似复活节彩蛋的行为?大概。在这种情况下,如果您不想让用户在此搜索中使用通配符,您可以执行以下两件事:
正确的转义通配符(和转义字符),
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)或用于LOCATE(substr, str) > 0查找精确匹配。