所以我在Rails 5中编写了一个应用程序,我对一个简单的特性的安全性问题很感兴趣用户进行挑选,在某个时间之前,这是彼此之间的秘密。如果我通过了:

@picks = Pick.all

它包含了每个人的选择,
对于带有控制器的视图,然后根据用户在视图上的身份过滤显示的内容,用户是否能够使用邪恶的方法访问@picks变量起初我认为是的,但现在我认为用户只是得到了发送的原始视图,而没有@picks变量除非用户可以偷偷开发自己的html视图?
不管怎样,在控制器中进行过滤可能是一个更好的主意,我只想看看如果您将变量全部提供给视图,然后在那里进行过滤,是否可以公开变量。

最佳答案

简短回答:
不,客户端无法直接访问@picks变量您的视图必须在视图中显示@picks的值,以便浏览器接收它。
长答案:
但是,最好在数据到达视图之前限制分配给@picks的数据。随着代码库的增长和老化,以及其他开发人员开始维护它,您可能记不起@picks变量包含不应在视图中显示的数据。
六个月后,当客户希望基于新的功能增强更新视图时,您不希望依赖正在修改视图的开发人员来知道@picks包含敏感数据。
通过将@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
保持你的代码简单和干巴巴的,你会在路上感谢你自己。

07-26 09:35