gpt4 book ai didi

php - 为查询准备用户定义的搜索词

转载 作者:可可西里 更新时间:2023-11-01 06:37:55 26 4
gpt4 key购买 nike

对于搜索功能,我编写了一个由 PHP 脚本执行的 MySQL 查询。我没有进行全文搜索。相反,我使用以下方法进行搜索:

... WHERE field LIKE '%etc%' AND field REGEXP '[[:<:]]etc[[:>:]]'

现在,我的想法是在 PHP 中准备这些动态值,例如:

$word = '2*3%5_1^0'; // just an example

$wordLike = strtr($word,array('\\'=>'\\\\','%'=>'\\%','_'=>'\\_'));
// instead of my old solution:
// $wordLike = preg_replace('~([%_])~', '\\\\$1', $word);
$wordLike = $db_con->escape('%' . $wordLike . '%');

$spaces = '[[:blank:]]|[[:punct:]]|[[:space:]]';
// I'm not sure about the difference between blank & space, though

$wordRX = preg_quote($word);
$wordRX = $db_con->escape('(^|'.$spaces.')'.$wordRX.'($|'.$spaces.')');
// instead of my old solution:
// $wordRX = $db_con->escape('[[:<:]]' . $wordRX . '[[:>:]]');

然后像在...中一样使用这些值

... WHERE field LIKE '$wordLike' AND field REGEXP '$wordRX'

使用此示例输入,结果为

...
WHERE field LIKE '%2*3\\%5\\_1^0%' AND
field REGEXP '[[:<:]]2\\*3%5_1\\^0[[:>:]]`

一些注意事项......

  • 在我的实际代码中,我让它处理多个单词,这只是伪代码。
  • 我用来搜索单词的方法 - 使用 LIKE & REGEXP together- 是我尝试过的方法中最快的一种。
  • 我知道我应该改用 PDO,请不要输入任何相关内容,除非它与我的问题相关

Q1:这是正确的方法吗?
Q2:这对于 SQL 注入(inject)是否足够安全?


一些附加信息

关于 MySQL REGEXP ……

以下字符由 preg_quote() 转义

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

以下是 REGEXP 中 [偶尔] 特殊字符的列表

. \ + * ? [ ^ ] $ ( ) { } | -

REGEXP 中还有其他结构但它们都被单/双括号包围,因为我知道所有括号都会被 preg_quote() 转义我觉得我不应该担心他们。

关于 MySQL LIKE ……

LIKE中仅有的2个特殊字符是

_ %

因此转义它们似乎是一种解决方法。
如果我遗漏了什么,请纠正我。

最佳答案

除了你提到的mysql_real_escape_string()函数应该可以很好地针对 SQL 注入(inject)进行清理。

你只需要使用适当的转义函数正确地转义任何用户输入,如果你将它想象成处理这个用户输入的链式处理 block ,你就会知道以什么顺序(从最后到第一个)以及要转义的内容/unescape 和 when,就确保干净的输入而言,你应该没问题(验证是一个不同的问题)。

而且,正如您似乎已经知道的那样,quote()在 PDO 或 Mysqli prepare()是更好的方法。

关于php - 为查询准备用户定义的搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com