'[ { \"name\": \"#{name}\" }]'") 这有效但破坏了构建,因为优秀-6ren">
gpt4 book ai didi

ruby-on-rails - rails ActiveRecord : How to use bind variables with double quotes on jsonb

转载 作者:行者123 更新时间:2023-11-29 12:08:27 27 4
gpt4 key购买 nike

我有一个 postgres jsonb 查询如下:

Blog.where("upload_data @> '[ { \"name\": \"#{name}\" }]'")

这有效但破坏了构建,因为优秀的制动员指出了可能的 sql 注入(inject)风险。如果我使用绑定(bind)变量:

Blog.where("upload_data @> '[ { \"name\": ? }]'", name)

它创建了一个像这样的 sql 查询:

WHERE upload_data @> '[ { "name": 'name' }]'

注意单引号——这是一个无效的查询

如果我使用单引号,我会得到:

WHERE upload_data @> "[ { 'name': 'name' }]"

这是无效的

我已经尝试了一些其他的东西,但我想要的是绑定(bind)变量评估为带双引号的字符串:

WHERE upload_data @> '[ { "name": "name" }]'

或者一个不同的解决方案 - 除了让 brakeman 跳过文件。

最佳答案

您不能将参数占位符放在带引号的字符串中。

Rails 允许您这样做并在单引号字符串中替换单引号字符串这一事实表明 Rails 未能(像往常一样)理解 SQL 规则。

但是您可以将参数占位符与其他字符串放在表达式中。我不是 PostgreSQL 的普通用户,但我假设您可以将字符串连接在一起以形成完整的 JSON 文字:

Blog.where("upload_data @> '[ { \"name\": \"' || ? || '\"}]'", name)

您可能会发现,如果您对整个 JSON 值进行参数化,您的代码会更加清晰。使用 %Q() 避免需要反斜杠文字双引号。

Blog.where("upload_data @> ?", %Q([ { "name": "#{name}" } ]))

或者为了确保生成有效的 JSON,我将表达式放在 Ruby 语法中,然后转换为 JSON:

Blog.where("upload_data @> ?", JSON.generate( [{name: name}] ))

关于ruby-on-rails - rails ActiveRecord : How to use bind variables with double quotes on jsonb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49175986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com