Ruby:变量/方法调用+安全性问题

时间:2011-03-28 14:46:24

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

所以,这是一个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?以检查用户是否有权使用任何内容,但有没有办法将权限与范围相关联?

谢谢!

2 个答案:

答案 0 :(得分:2)

TBH,除非你有这些范围的 lot ,否则我只需对它们进行硬编码或创建哈希映射将url param值映射到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

答案 1 :(得分:1)

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

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

但是,假设这可能是一个安全问题,那么你是100%正确的。随后,您可能希望执行以下操作:

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