所以我正在用 Rails 5 编写一个应用程序,我对我尝试编写的一个简单功能的安全问题很感兴趣。用户做出 Picks,这些 Picks 在特定时间之前是彼此保密的。如果我通过:
@picks = Pick.all
其中包含每个人的选择,
使用 Controller 访问 View ,然后根据 View 中的用户过滤显示的内容,用户是否能够使用恶意方法访问该 @picks
变量?起初我认为是的,但现在我认为用户只是得到发送的原始 View ,没有 @picks
变量。除非用户可以偷偷摸摸地开发自己的 html View ?
无视在 Controller 中进行过滤可能是更好的主意,我只是想看看是否可以公开变量,如果您将它们完整地提供给 View 然后在那里过滤它们。
最佳答案
简答:
不可以,客户端不能直接访问@picks
变量。您的 View 必须在 View 中显示 @picks
的值,以便浏览器接收它。
长答案:
但是,最好在数据到达 View 之前限制分配给 @picks
的数据。随着代码库的增长和老化,也许其他开发人员开始维护它,您可能不记得 @picks
变量包含不应在 View 中显示的数据。
六个月后,当客户想要根据新功能增强更新 View 时,您不想依赖正在修改 View 的开发人员知道 @picks
包含敏感数据。
通过将 @picks
的内容限制为当时允许用户查看的那些记录,让 future 的开发人员(包括您)的生活变得轻松。使用评论中建议的代码是个好主意:
@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
然后你的 Controller 代码是:
@picks = current_user.authorized_picks
这样一来,您的所有业务逻辑都在模型中,90% 的时间它都属于模型。这也允许您保留代码 DRY通过将授权逻辑全部集中在一个地方。
让您的代码保持简单和 DRY,您将感谢自己。
关于ruby-on-rails - 简单的 Rails 安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47804821/