ruby-on-rails - 简单的 Rails 安全问题

标签 ruby-on-rails ruby security

所以我正在用 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/

相关文章:

C 缓冲区溢出 - 输入多少字节

ruby-on-rails - 未初始化的常量 OpenSSL (NameError)

ruby-on-rails - rails 4 : Paperclip and rails_admin "undefined method ` attachment_definitions' error"

ruby-on-rails - Rails schema.rb 中 sqlite_sp_functions 的用途是什么?

ruby-on-rails - Rails - 如何在自定义布局中使用 application.html.erb?

ruby - 如何使用每个迭代器获取数组索引或迭代次数?

ruby-on-rails - ActiveAdmin 有条件地显示列

ruby-on-rails - 没有要加载的文件 - Rails 3.2 中的 bundle 程序/设置与 Passenger

linux - chmod 777 的后果

c# - 保护 Web 方法