2010-09-23 39 views
6

我想采取用户输入,表示为$ dangerous_string,并将其用作MySQL查询中RegEx的一部分。在MySQL中正则表达式逃避用户输入的最佳方式是什么?

要做到这一点,最好的方法是什么?我想用用户的字符串作为文字 - 如果它包含任何在MySQL RegEx中含义的字符,这些字符实际上不应该影响我的正则表达式。

$dangerous_string = $_GET["string"]; 
//do something here 
$dangerous_string = what_goes_here($dangerous_string); 
$sql = "SELECT * FROM table WHERE search_column REGEX '[[:<:]]$dangerous_string'"; 

//etc.... 

回答

2

据我所知,有逃避的MySQL正则表达式中没有原生的方式。你可以在PHP中用preg_quote(http://www.php.net/manual/en/function.preg-quote.php)来完成,这可能会为你做好工作,但显然不是为此目的而设计的。

我首选的方式,如果我是你的情况是构建在PHP中的正则表达式白名单,然后可以应用到你的危险字符串:

$safeString = preg_replace('/[^\w]/','',$dangerousString); 

这消除了任何非单词字符(即除了什么A-Za-z0-9_)。

NB我相信给出的其他答案不会删除/转义正则表达式特殊字符,我相信这是您的要求。

+0

这将工作得很好。谢谢! – Sambo 2010-09-23 21:02:45

-2

在传递到数据库之前,您需要确保报价和标记正确处理 。最好的方法是:

mysql_real_escape_string ([php doc][1]) 

此方法在PHP和C++ mysql客户端库都可用。

这应确保任何'dangerous_string'不再危险 并且可以在RegEx使用的带引号的字符串中使用。

+0

对于REGEXP的解释不做任何事情,这是个问题。 – Wrikken 2010-09-23 20:58:27