使用 PHP 转义用户输入以在 PostgreSQL 正则表达式中使用?

Zil*_*ilk 3 php regex postgresql pcre escaping

我正在创建一个与~or匹配的正则表达式模式~*,其中部分模式由应用程序创建,部分来自用户输入:

$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");
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是有效的,但我不完全确定它的安全性:

  • PHP 是否preg_quote()转义(至少)PostgreSQL 正则表达式中的所有特殊字符?
  • 是否有任何可能的$userInput值可以破坏转义?

(在$userInput到达这个阶段之前有一些通用的处理- 编码、字符集、接受的字符范围等。查询参数用于大多数(实际)查询,但这部分 SQL 是手动创建的。)

Fun*_*uit 5

是的。从docs~~*使用 POSIX 正则表达式,这意味着这些字符被特殊处理:

()[]{}^$|?:.\
Run Code Online (Sandbox Code Playgroud)

preg_quote,从文档中,只是盲目地通过并放置一个反斜杠(即转义)所有这些字符:

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

换句话说,它转义了所有需要转义的字符。

但是,您仍然应该小心。如果您决定使用LIKESIMILAR TO在将来的某个时间点,_并且%不会被转义。此外,您必须记住不要使用不同的转义字符;如果你这样做了,所有仔细的验证都会消失,你会得到许多奇怪的错误。