如何在使用PHP时,对用户输入进行转义以在PostgreSQL正则表达式中使用?

3

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

$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是手动创建的。

1个回答

5

是的,根据文档~~*使用POSIX正则表达式,这意味着这些字符被特殊处理:

()[]{}^$|?:.\

preg_quote函数来自官方文档,该函数会盲目地扫描并在下列字符前添加反斜杠(即转义):

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

换句话说,它会转义所有需要转义的字符。但是你仍然需要小心。如果将来决定使用LIKESIMILAR TO_%不会被转义。此外,您必须记住不要使用不同的转义字符;如果这样做,所有仔细的验证都将无效,您将遇到一堆奇怪的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接