【问题标题】:Escaping user input for use in a PostgreSQL regex using PHP?使用 PHP 转义用户输入以在 PostgreSQL 正则表达式中使用?
【发布时间】:2016-10-12 14:21:15
【问题描述】:

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

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

【问题讨论】:

    标签: php regex postgresql escaping pcre


    【解决方案1】:

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

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

    preg_quote,来自the docs,只是盲目地通过并在所有这些字符上加上一个反斜杠(即转义):

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多