Rails ActiveRecord:如何在 jsonb 上使用带双引号的绑定变量
Rails ActiveRecord: How to use bind variables with double quotes on jsonb
我有一个 postgres jsonb 查询如下:
Blog.where("upload_data @> '[ { \"name\": \"#{name}\" }]'")
这有效但破坏了构建,因为优秀的制动员指出了可能的 sql 注入风险。如果我使用绑定变量:
Blog.where("upload_data @> '[ { \"name\": ? }]'", name)
它创建一个 sql 查询,如:
WHERE upload_data @> '[ { "name": 'name' }]'
注意单引号 - 这是无效查询
如果我使用单引号,我会得到:
WHERE upload_data @> "[ { 'name': 'name' }]"
无效
我已经尝试了一些其他的东西,但我想要的是绑定变量评估为带双引号的字符串:
WHERE upload_data @> '[ { "name": "name" }]'
或者不同的解决方案 - 除了让 brakeman 跳过文件。
不能将参数占位符放在带引号的字符串中。
Rails 允许您这样做并在 single-quoted 字符串中替换 single-quoted 字符串这一事实表明 Rails 未能(像往常一样)理解SQL.
规则
但是您可以将参数占位符与其他字符串放在表达式中。我不是普通的 PostgreSQL 用户,但我假设您可以将字符串连接在一起形成完整的 JSON 文字:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
您可能会发现,如果参数化整个 JSON 值,代码会更加清晰。使用 %Q()
以避免需要反斜杠文字 double-quotes.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
或者为了确保生成有效的 JSON,我将表达式置于 Ruby 语法中,然后转换为 JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))
我有一个 postgres jsonb 查询如下:
Blog.where("upload_data @> '[ { \"name\": \"#{name}\" }]'")
这有效但破坏了构建,因为优秀的制动员指出了可能的 sql 注入风险。如果我使用绑定变量:
Blog.where("upload_data @> '[ { \"name\": ? }]'", name)
它创建一个 sql 查询,如:
WHERE upload_data @> '[ { "name": 'name' }]'
注意单引号 - 这是无效查询
如果我使用单引号,我会得到:
WHERE upload_data @> "[ { 'name': 'name' }]"
无效
我已经尝试了一些其他的东西,但我想要的是绑定变量评估为带双引号的字符串:
WHERE upload_data @> '[ { "name": "name" }]'
或者不同的解决方案 - 除了让 brakeman 跳过文件。
不能将参数占位符放在带引号的字符串中。
Rails 允许您这样做并在 single-quoted 字符串中替换 single-quoted 字符串这一事实表明 Rails 未能(像往常一样)理解SQL.
规则但是您可以将参数占位符与其他字符串放在表达式中。我不是普通的 PostgreSQL 用户,但我假设您可以将字符串连接在一起形成完整的 JSON 文字:
Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)
您可能会发现,如果参数化整个 JSON 值,代码会更加清晰。使用 %Q()
以避免需要反斜杠文字 double-quotes.
Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))
或者为了确保生成有效的 JSON,我将表达式置于 Ruby 语法中,然后转换为 JSON:
Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))