我正在创建一个正则表达式模式,该模式可以与~
或~*
匹配,其中一部分模式由应用程序创建,另一部分来自用户输入:
$userInput = "t ' e * \\s * t ( i \n g";
$pattern = "(a|b|c)" . preg_quote($userInput) . "(x|y|z)";
$pattern = pg_escape_literal($conn, $pattern);
$result = pg_query($conn, "SELECT * FROM example WHERE name ~* $pattern");
目前看来,这个方法是可行的,但我并不完全确定它的安全性:
- PHP的
preg_quote()
函数是否转义了PostgreSQL正则表达式中(至少)所有特殊字符? $userInput
的值是否存在可能破坏转义的情况?
在进入此阶段之前,$userInput
会进行一些通用的处理 - 编码、字符集、接受的字符范围等。大部分(实际)查询都使用查询参数,但此部分SQL是手动创建的。