【问题标题】:Ruby: Variable variable / method call + security concernsRuby:变量变量/方法调用+安全问题
【发布时间】:2011-07-24 13:27:19
【问题描述】:

所以,这是一个 Rails 应用程序,但实际上更像是一个普通的 ruby​​ 问题:

我有一个具有多个范围的模型。例如:

Photo.recent
Photo.popular
Photo.featured

我的应用中有一个“浏览照片”视图,我希望能够传递一个参数并让用户指定他们想要查看的范围,即:

example.com/photos/browse?view=recent

这给了我 params[:view],我需要将其作为 Photo 上的方法调用附加。

所以我的第一个问题是,你怎么能在 Ruby 中做这种事情?

其次,如果我不能限制输入,这可能是一个安全风险,如果我只附加 Photo.whatever the user types in the url 那么我就有黑客说example.com/photos/browse?view=delete_all 的风险,这显然是个坏主意.

所以我的第二个问题是,我怎样才能创建一个白名单或可以调用的东西 - 或者更好地设置某种可以安全地接受来自 URL 的参数并且仅在用户请求时才返回信息的方法一个有效的命名范围。

最后,我有一些仅供管理员使用的范围。我定义了用户权限(使用 CanCan),因此我可以查询 current_user.has_role? 以检查用户是否被授权执行任何操作,但有没有办法将权限与范围相关联?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby security variables methods


    【解决方案1】:

    TBH,除非您有 很多 个这些范围,否则我只会对它们进行硬编码或创建一个哈希,将 url 参数值映射到 lambdas

    如果您确实想按照您所说的去做,您可以执行以下操作:

    whitelist = %w(
      recent
      popular
      featured
    )
    
    if whitelist.include? params[:view]
      photos = Photo.send params[:view].to_sym
    end
    

    见:http://apidock.com/ruby/Object/send

    编辑:也许试试这个?

    if Photo.valid_scope_name? params[:view]
      photos = Photo.send params[:view].to_sym
    end
    

    这是一种受保护的方法,因此您可能必须使用:

    if Photo.send :valid_scope_name?, params[:view]
      photos = Photo.send params[:view].to_sym
    end
    

    http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/valid_scope_name%3F

    【讨论】:

    • 这看起来可行,而且我认为范围的数量是可控的。出于好奇,您知道如何在没有手动编写的白名单的情况下执行此操作吗?
    【解决方案2】:

    要发送方法,请使用send 方法:)

    Photo.send(params[:view].to_sym)
    

    但是,您 100% 正确地认为这(可能)是一个安全问题。随后,您可能需要执行以下操作:

    Photo.send(params[:view].to_sym) if %w(recent popular featured).include?(params[:view])
    

    【讨论】:

    • 仅供参考,发送方法也接受字符串...不需要 to_sym
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2011-09-02
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多