【问题标题】:Escape a literal so that it is wrapped with double quotes转义文字,使其用双引号括起来
【发布时间】:2019-06-18 14:20:15
【问题描述】:

我们使用学说 2 并希望编写这样的参数化代码:

attributes @> \'{' . $con->quote($attrId) . ':' . (int)$value . '}\'';

有这样的查询:

WHERE attributes @>'{"color":14}';

"color" 是属性的自定义(用户选择)名称。所以我觉得quote()是一个合适的屏蔽功能。但是它用单引号包裹了一个参数,导致请求语法不正确。

quoteIdentifier() 函数用双引号括起来,但我不确定在这种情况下使用它是否正确。

如何构建安全的代码来获取我需要的请求?

【问题讨论】:

    标签: php postgresql doctrine-orm doctrine doctrine-orm-postgres


    【解决方案1】:

    这是一种使用json_build_objectpg_exec_params 的方法:

    <?php
    $dbconn = pg_connect('');
    $data = 'some"th\'ing';
    pg_query_params($dbconn, 'SELECT json_build_object($1::text, $2::integer)', [$data, 14]);
    ?>
    

    您需要显式类型转换,以便 PostgreSQL 知道参数是字符串还是数字。

    【讨论】:

    • 谢谢!但是,当 json_build_object() 做这件事时,我们真的需要 pg_query_params() 吗?
    • 刚刚在 Postgres 文档中找到关于类似函数 to_json(anyelement) "...对于除数字、布尔值或空值以外的任何标量类型,将使用文本表示,并正确引用并转义为有效的 JSON 字符串。”
    【解决方案2】:

    您可以在字符串中包含双引号。

    $attr = '{"' . $attrId . '":' . (int) $value . '}';
    

    不要依赖引用来保证您的安全,而是使用将值绑定到准备好的语句的方法执行查询。

    $statement = $con->executeQuery('SELECT * FROM your_table WHERE attributes @> ?', [$attr]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多