繁体   English   中英

PDO / MYSQL准备好的语句不转义字符?

[英]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 workingI do 100 pushups daily不会I do 100 pushups daily

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM