所以我在Rails 5中编写了一个应用程序,我对我正在编写的一个简单功能的安全性问题感兴趣。用户制作精选,彼此之间是秘密的,直到某个时间。如果我通过:
@picks = Pick.all
包含每个选秀权,
使用控制器查看视图,然后根据用户在视图中的用户过滤显示的内容,用户是否可以使用恶意方法访问该@picks
变量?起初我认为是的,但现在我认为用户只是获得了没有@picks
变量的原始视图。除非用户可以偷偷摸摸开发自己的HTML视图?
无论如何忽略在控制器中进行过滤可能是个更好的主意,我只是想看看你是否可以公开变量,如果你把变量全部提供给视图然后在那里过滤它们。
答案 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执行服务器渲染时,所有实例变量都将用于在服务器端准备视图。
无论如何,最好在控制器端进行过滤。