【问题标题】:Security for Rails-based javascript apps: How do you verify permissions on a user within rendered javascript?基于 Rails 的 javascript 应用程序的安全性:如何在呈现的 javascript 中验证用户的权限?
【发布时间】:2013-12-05 14:42:47
【问题描述】:

如果这是此问题的错误堆栈,请道歉。如果是这样,请引导我到正确的网站。

我有一个 Rails 应用程序,其中用户可以是以下三个角色之一的成员:useradminsystem。然而,我的 rails 应用程序基本上用作主干应用程序的 JSON 后端。所有客户端的繁重工作都是通过在资产管道中处理的咖啡脚本文件完成的。

现在,我通过在application.html.slim 级别创建的对象将一些用户属性输入到javascript 中。看起来像这样的东西:

APP.currentUser = 
  name: "#{@current_user.name}"
  role: "#{@current_user.role}"

在我的主干应用程序的几个地方散布着这样的调用:

if APP.currentUser.role is 'admin'...

这似乎很不安全,因为任何有知识的人都可以打开一个开发控制台,将App.currentUser 的实例修改为admin,然后访问前端的管理功能。现在,rails 端足够聪明,可以检查并确保@current_user 可以在尝试执行这些功能之前执行这些功能,但似乎仍然应该有一种方法可以在前端防止这种情况发生,而无需发布角色进入javascript。

我是不是过于谨慎了,还是错过了什么?

【问题讨论】:

  • 你过于谨慎了。用户是否可以在客户端启用“管理”内容并不重要,只要服务器不让它做任何事情。

标签: javascript ruby-on-rails security backbone.js coffeescript


【解决方案1】:

嗯,我认为你不能做得比这更好。在我需要在我的视图上引入操作权限的情况下,我曾经做过类似的事情。像这样的:

在 Rails 后端:

def as_json(options={})
    super(:include => {
        :attributes_to_include
    }
    ).merge({
        :permissions=> {
            :can_create => (user.can_create?),
            :can_delete => (user.can_delete?),
            :can_update => (user.can_update?)
        }
    })
end

在骨干前端

if(@user.permissions.can_create)
    # Display create view
if(@user.permissions.can_update)
    # Display update view
.....

通常这是你能做的最好的。你不能在前端对用户隐藏视图,除非整个页面是从 Rails 后端加载的,并考虑了视图权限。当然,这与当今处理基于 Ajax 的视图的方式相矛盾。

此外,您需要确保在 Rails 后端授权操作。

【讨论】:

    【解决方案2】:

    我不知道您是否遗漏了任何东西,但我认为没有任何方法可以让您的蛋糕(管理员和非管理员 UI 驻留在一个主干应用程序中)也可以吃掉(制作非管理员安全无法访问管理 UI)。您基本上必须在仅将管理 UI 下载给已确认的管理员和接受这种“开放”之间做出选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2020-01-03
      • 2011-04-09
      • 2013-06-11
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多