在MySQL中逃避正则表达式的用户输入的最佳方法是什么?

Sam*_*mbo 7 php regex mysql escaping

我想接受用户输入,表示为$ dangerous_string,并将其用作MySQL查询中RegEx的一部分.

这样做的最佳方法是什么?我想使用用户的字符串作为文字 - 如果它包含任何在MySQL RegEx中有意义的字符,那些字符实际上不应该影响我的正则表达式.

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

//etc....
Run Code Online (Sandbox Code Playgroud)

lon*_*day 2

AFAIK,MySQL 正则表达式没有转义的本机方法。您可以在 PHP 中使用 preg_quote (http://www.php.net/manual/en/function.preg-quote.php) 来完成此操作,它可能会为您完成这项工作,但显然不是为此目的而设计的。

如果我处于您的情况,我的首选方法是在 PHP 中构建一个正则表达式白名单,然后您可以将其应用于危险字符串:

$safeString = preg_replace('/[^\w]/','',$dangerousString);
Run Code Online (Sandbox Code Playgroud)

这将从字符串中删除所有非单词字符(即除 A-Za-z0-9_ 之外的任何字符)。

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