Rails 4清理用户输入

时间:2014-07-17 14:05:23

标签: sql ruby-on-rails json sanitize

我目前正在使用Ruby on Rails创建API。我只是想知道是否有内置的Rails方法或库/ gems来清理Json和SQL,或者Rails 4是否默认执行此操作?我最担心的是我有一个SQL语句,例如

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

或类似

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

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

2 个答案:

答案 0 :(得分:13)

默认情况下,使用以下内容将清理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')

答案 1 :(得分:9)

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

来自guides - 请勿执行以下操作:

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

取而代之的是

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