【问题标题】:Rails: Search for substring without getting SQL InjectedRails:在不注入 SQL 的情况下搜索子字符串
【发布时间】:2015-07-25 06:40:15
【问题描述】:

我正在尝试为 Rails 实现自动完成功能。我的代码中有以下内容 -

Location.where("name like ?", "%#{params[:location]}%")

恐怕这会导致 SQL 注入。类似于以下内容 -

SELECT * FROM Locations WHERE (name LIKE '%green%') OR 1=1--%'

params[:location] 是这样的green%') OR 1=1--

有什么方法可以避免使用 SQLi 在 Rails 中进行基于子字符串的搜索?

【问题讨论】:

  • 你试过了吗?这种形式不应该防止这种事情吗?我不记得了。

标签: ruby-on-rails ruby-on-rails-4 sql-injection


【解决方案1】:

戴夫是对的。试试看它输出什么。它将整个事情作为条件的一部分包装起来。在我的课程模型中。

> x = "'') OR SELECT * FROM Users"
=> "'') OR SELECT * FROM Users"
> Course.where(["name like ?", "%#{x}%"])
  Course Load (38.7ms)  SELECT "courses".* FROM "courses" WHERE 
  (name like '%'''') OR SELECT * FROM Users%')
=> []

【讨论】:

    【解决方案2】:

    如果您使用的是 Postgres,我建议您使用 Postgres 中的 trigram 支持来执行此操作。

    将其放入迁移中以进行设置:

    CREATE EXTENSION pg_trgm;

    然后像这样运行您的查询:

    Location.select('*', "similarity(search_term, #{ActiveRecord::Base.sanitize(search_term)}) AS similarity").order('similarity DESC, search_term')

    或者,只是做你正在做的事情,但将参数包装在#{ActiveRecord::Base.sanitize(search_term)}

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多