Rails 4 清理用户输入

Posted

技术标签:

【中文标题】Rails 4 清理用户输入【英文标题】:Rails 4 Sanitizing User Input 【发布时间】:2014-09-08 10:58:26 【问题描述】:

我目前正在使用 Ruby on Rails 制作 API。我只是想知道是否有内置的 Rails 方法或库/宝石来清理 Json 和 SQL,或者 Rails 4 默认情况下是否这样做?我最担心这样的情况,我有一个 SQL 语句,例如

User.where("users.first_name IS NOT NULL") 

或类似的东西

Event.where(:location => params[:location]). 

基本上,在我的 SQL 语法和传入的 JSON 请求中我应该注意什么?

【问题讨论】:

【参考方案1】:

如果您正确格式化查询,Rails 会自动执行此操作

来自guides - 不要这样做:

Project.where("name = '#params[:name]'")

改为

Project.where("name = ?", params[:name])

【讨论】:

关于插值的问号很好,但我不清楚 Event.where(:location => params[:location]). 是否会被清理。 @maxpleaner 它会做 - further down the guides page【参考方案2】:

默认情况下,使用以下命令将清理 str 并使其免受 SQL 注入

User.where(name: str)
User.where('name ILIKE ?', str)

但是,以下代码(直接字符串插值,然后将其提供给 where 方法)使其对 SQL 注入不安全

User.where("name = '#str'")

就你而言,你可以使用ActiveRecord::Base.sanitize(your_string_from_user_input)。它将使用您的数据库适配器转义/引用相关部分,防止 SQL 注入

在模型中,您可以直接访问sanitize 方法(因为您处于已经从 ActiveRecord::Base 继承的上下文中):

class User < ActiveRecord::Base

  def self.search(string)
    terms = string.split
    searchable_columns = [:name, :username, :whatever]
    query = terms.map do |term|
      fields = searchable_columns.map |column|
        " #self.table_name.#column LIKE '#sanitize("%#term%")'"
      end
      "(#fields.join(' OR '))"
    end.join(' AND ')

    where(query)
  end
end

上面的代码会产生如下的 SQL WHERE 子句:

# str is 'bob doe'
WHERE 
  (users.name LIKE 'bob' OR users.username LIKE 'bob' OR users.whatever LIKE 'bob')
AND
  (users.name LIKE 'doe' OR users.username LIKE 'doe' OR users.whatever LIKE 'doe')

【讨论】:

这是一个不错的解决方案。 谢谢,太好了!

以上是关于Rails 4 清理用户输入的主要内容,如果未能解决你的问题,请参考以下文章

清理用户输入PHP

何时最好清理用户输入?

Ruby on Rails:不使用 find 时如何为 SQL 清理字符串?

PHP 清理 SQL DDL 语句的用户输入的方式是啥?

出于安全目的,在 bash 中清理用户输入

PHP PDO 清理用户输入