[英]PDO/MYSQL prepared statements not escaping characters?
我正在尝试在程序中编写强大的搜索功能:
$search = "%".$_POST['search']."%";
$query=$connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?");
$query->execute(array($search));
但是,似乎用户只需输入%即可返回所有结果。 如何防止这种情况发生? 我的印象是,使用准备好的语句可以避免这些字符。 这是否也适用于其他字符(\\,'等)? 我该如何解决?
准备好的语句不会逃避任何事情。 准备语句时,查询将进行预编译,因此只需要填充占位符( ?
)。由于无法更改预编译查询的SQL,因此无需转义。
要解决此问题,请手动转义%
和_
。
添加:
一些常识性的推理:在您的情况下,当用户在搜索%%%
输入%
,您的$search
变量将包含字符串%%%
。 MySQL怎么知道,它应该逃脱哪个%
,哪个应该留下呢?
如果您不希望将%
或_
用作有效输入,则需要防止在其中添加%
或_
。
if (strpos($_POST['search'], '%') !== FALSE || strpos($_POST['search'], '_') !== FALSE) {
$query = $connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?");
$query->execute(array($search));
}
else echo "% and _ are not allowed!";
至于像'
这样'
字符,它们将被视为代替?
传递的字符串的一部分?
占位符,未串联以构建SQL语句。 因此,它们是安全的。
您必须正确地转义用户输入,以使服务器知道哪些字符是通配符,哪些是要匹配的数据。
$search = '%' . str_replace(array('_', '%'), array('\\_', '\\%'), $_POST['search']) . '%';
这样可以避免那些原本被认为是通配符的字符。 $search
现在将包含以下内容:
%100\%%
这将与I always give 100% when working
匹配I always give 100% when working
但I do 100 pushups daily
不会I do 100 pushups daily
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.