用于查询的定义的搜索项
对于搜索功能,我编写了一个MySQL查询,由PHP脚本执行。 我没有进行全文搜索。 相反,我正在使用以下方法进行搜索:
... 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
一起 - 是我尝试的方法中最快的一个。 问题1:这是否正确?
Q2:这对SQL注入来说足够安全吗?
一些额外的信息
关于MySQL REGEXP
...
通过preg_quote()转义以下字符
。 + *? [^] $(){} =! <> | : -
以下是REGEXP
中[偶尔]特殊字符的列表
。 + *? [^] $(){} | -
REGEXP
中还有其他的构造,但它们都被单/双括号包围,并且因为我知道所有的括号都会被preg_quote()转义,所以我觉得我不应该关心它们。
关于MySQL LIKE
...
LIKE
中只有2个特殊字符
_%
所以逃避它们似乎已经足够解决问题了。
如果我缺少任何东西,请纠正我。
从你提到的mysql_real_escape_string()函数中,Appart应该对SQL注入进行消毒处理。
您只需使用适当的转义函数正确地转义任何用户输入,如果您将其视为处理此用户输入的链式处理块,您将知道按何种顺序(从上次到第一次)以及何时转义/ unescape以及何时,只要确保一个干净的输入(确认是一个不同的问题),你应该没问题。
而且,正如您似乎已经知道的那样,PDO或Mysqli prepare()中的quote()是更好的方法。
试试这个使用mysql_real_escape_string()
$word = '2*3%5_1^0';
$query = 'SELECT * FROM TABLE_NAME WHERE field REGEXP "(.*)[[:<:]]'.mysql_real_escape_string($word).'[[:>:]](.*)" ';
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
然后:
$word = clean($_POST['whatever post']);
然后修剪词和你的好去。 这个php函数的作用是将所有文字转化为字符串,因此没有人可以说删除你的db等
链接地址: http://www.djcxy.com/p/62581.html