gpt4 book ai didi

sql - 在 Rails 中转义 SQL LIKE 查询

转载 作者:行者123 更新时间:2023-12-04 11:23:44 24 4
gpt4 key购买 nike

在 rails 源 ( https://github.com/rails/rails/blob/fe4b0eee05f59831e1468ed50f55fbad0ce11e1d/activerecord/lib/active_record/sanitization.rb#L112 ) 中有一个 sanitize_sql_like方法(我希望)在将字符串与 SQL LIKE 一起使用之前对其进行清理

但是,我似乎无法使用它,因为 Rails 说该方法不存在。

我的字符串中有一个撇号,查询是

@query = "Joe's"
Model.where("lower(field) LIKE ?", "%#{@query}%")

使用 ActiveRecord::Base.sanitize没有帮助,因为查询没有结果。

我怎样才能逃脱 @query ,并确保我的 SQL 安全?

最佳答案

如果您使用 where正确地,它会自动转义输入

@query = "Joe's"
Model.where("lower(field) LIKE ?", "%#{@query}%")

请注意,您的查询是错误的。您有一个 lower()运算符,然后您传递一个不是小写的输入。查询将始终返回 0。

此外, lower()会降低数据库使用索引的能力。在大多数数据库中,LIKE 已经不区分大小写(PostgreSQL 除外,您应该使用 ILIKE )。
query = "Joe's"
Model.where("field LIKE ?", "%#{query}%")

或者
query = "Joe's"
Model.where("field ILIKE ?", "%#{query}%")

这是一个真实数据库的真实示例。如您所见,输入在最终 SQL 中被正确转义。
> query = "Joe's"
> User.where("lower(email) LIKE ?", "%#{query}%")
User Load (4.4ms) SELECT "users".* FROM "users" WHERE (lower(email) LIKE '%Joe''s%')
=> #<ActiveRecord::Relation []>

关于sql - 在 Rails 中转义 SQL LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775906/

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