【问题标题】:Using variable in ActiveRecord where condition在 ActiveRecord 中使用变量 where 条件
【发布时间】:2016-11-02 06:12:18
【问题描述】:

我有条件根据一些搜索关键字过滤/搜索帖子标题和用户

如您所见,这些值可用于以下两种类型的 where 条件:

Post.where('title ILIKE :keyword or user_name ILIKE :keyword', keyword: "%#{params[:search_keyword]}%")

Post.where('title ILIKE ? or user_name ILIKE ?', "%#{params[:search_keyword]}%", "#{%params[:search_keyword]}%")

第一个是直接在条件内部使用variable,第二个是使用? 符号。第一个对我来说很容易,如果有很多变量要比较,因为我可以声明一个变量并多次使用它。

谁能告诉我使用第一个或两者是否相同有任何缺点安全问题

谢谢:-)

【问题讨论】:

  • 在我看来,第二个是最佳实践,而不是第一个。与其调用 Post.where,不如在辅助方法中编写过滤器并在 Post 或任何需要的地方调用该辅助器,这样会更好。
  • @Erica Bista 有什么理由认为第二个是最好的吗?
  • 因为它更清晰并遵循搜索标准。它还允许您使用插值搜索每个文件,您想对代码执行什么操作。在第一个中,您正在搜索关键字并再次为该关键字插入一些内容。而在第二个中,您正在搜索带有值的标题。
  • @Dan 是的。我也更喜欢第一个,因为它使用起来既简单又干净。两者是否相同,第一个是否存在任何安全问题?
  • 我认为两者都同样安全。您不想做的是在查询字符串中插入写入。 where('title ILIKE "%#{params[:search_keywords]}%"') 我相信更容易受到恶作剧的影响。

标签: ruby-on-rails security ruby-on-rails-4 activerecord


【解决方案1】:

这两种方式对我来说似乎都很好。

有关更多详细信息,请查看此 rails 官方安全指南。 http://guides.rubyonrails.org/security.html#sql-injection

【讨论】:

  • 是的,我已经调查过了,但没有指定我使用的第一种类型,所以我怀疑它。
  • 是的,我同意。感谢您的回复。
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多