【问题标题】:rails 3 activerecord order - what is the proper sql injection work around?rails 3 activerecord order - 什么是正确的sql注入工作?
【发布时间】:2011-10-15 01:13:54
【问题描述】:

假设我有一个用户列表页面,您可以按不同的列进行排序,当单击“电子邮件”时,它将通过 sort_by=email sort_direction=asc 或 desc

sort_by = "email" # really params[:sort_by]
sort_direction = "asc" # really params[:sort_direction]
User.order("#{sort_by} #{sort_direction}")
# SELECT "users".* FROM "users" ORDER BY email asc

这样可以按预期工作,但是如果我们更改 sort_by

sort_by = "email; DELETE from users; --"
User.order("#{sort_by} #{sort_direction}")
# SELECT "users".* FROM "users" ORDER BY email; DELETE from users; -- asc

现在我们没有更多用户了:(

我可以手动建立一个有效 sort_by 的白名单并将 params[:sort_by] 与之进行比较,但希望有一些内置的方法来处理这种事情

【问题讨论】:

    标签: ruby-on-rails-3 ruby-on-rails-3.1 sql-injection


    【解决方案1】:

    瑞安贝茨的方法:

    在您的控制器中:

    def index
      @users = User.order(sort_by + " " + direction)
    end
    
    private
      def sort_by
        %w{email name}.include?(params[:sort_by]) ? params[:sort_by] : 'name'
      end
    
      def direction
        %w{asc desc}.include?(params[:direction]) ? params[:direction] : 'asc'
      end
    

    基本上你是在创建一个白名单,但它很容易做到并且不易被注入。

    【讨论】:

    • 如果您不关心他们可以对哪些列进行排序,您可以将%w{email name} 替换为User.column_names
    • 看到这里,我想我一定是采用了 Ryan 的代码,因为它是我很久以前写的。对我来说,我认为它有效且安全,但我不是那么好,最近,我注意到制动器似乎在抱怨潜在的 sql 注入。假设我的版本没问题,而且我不是唯一的,有什么办法可以说服刹车员我没问题?
    猜你喜欢
    • 2017-11-10
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多