简单的Rails安全问题

时间:2017-12-14 02:00:52

标签: ruby-on-rails ruby security

所以我在Rails 5中编写了一个应用程序,我对我正在编写的一个简单功能的安全性问题感兴趣。用户制作精选,彼此之间是秘密的,直到某个时间。如果我通过:

@picks = Pick.all

包含每个选秀权, 使用控制器查看视图,然后根据用户在视图中的用户过滤显示的内容,用户是否可以使用恶意方法访问该@picks变量?起初我认为是的,但现在我认为用户只是获得了没有@picks变量的原始视图。除非用户可以偷偷摸摸开发自己的HTML视图?

无论如何忽略在控制器中进行过滤可能是个更好的主意,我只是想看看你是否可以公开变量,如果你把变量全部提供给视图然后在那里过滤它们。

2 个答案:

答案 0 :(得分:3)

简答:

不,客户端无法直接访问@picks变量。您的视图必须在视图中显示@picks的值,以便浏览器接收它。

长答案:

但是,最好在分配到@picks之前将数据限制在视图之前。随着代码库的增长和老化,以及其他开发人员可能开始维护它,您可能不记得@picks变量包含不应在视图中显示的数据。

未来六个月,当客户希望根据新功能增强更新视图时,您不希望依赖正在修改视图的开发人员知道@picks包含敏感数据。 / p>

通过将@picks的内容限制为当时允许用户查看的记录,让未来的开发人员(包括您)轻松过关。使用评论中建议的代码是一个好主意:

@picks = current_user.picks

或者更好的是,在模型中添加一个方法,该方法包含用于确定在给定时间用户可以使用哪些选择的业务逻辑:

class User < ApplicationRecord
...
  def authorized_picks
    # code that returns the picks this user is allowed to see right now
  end
...
end

然后你的控制器代码是:

@picks = current_user.authorized_picks

这样,您的所有业务逻辑都在模型中,它在90%的时间内属于该模型。这也允许您通过将授权逻辑集中在一个位置来保留代码DRY

保持你的代码简单和干燥,你会感谢你自己。

答案 1 :(得分:1)

不,他们将无法获取我们在haml / erb文件中使用的实例变量。他们只是得到原始的HTML。

当Ruby on rails执行服务器渲染时,所有实例变量都将用于在服务器端准备视图。

无论如何,最好在控制器端进行过滤。