【问题标题】:Rails 4 Sanitizing User InputRails 4 清理用户输入
【发布时间】: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 请求中我应该注意什么?

【问题讨论】:

    标签: sql ruby-on-rails json sanitize


    【解决方案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')
    

    【讨论】:

    • 这是一个不错的解决方案。
    • 谢谢,太好了!
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多