1

我实际上正在为我的公司开发一个单页应用程序,该应用程序涉及不同用户角色的不同视图,以防止没有足够权限的人访问他们不应该看到的数据或执行他们无权执行的功能.

我在后端使用带有 REST api 的 PHP,所以我认为我在那里相当安全,但我对客户端安全一无所知。

我正在考虑在我的 main.js 中以这种方式存储具有当前用户角色的 App 变量:

require(['jquery',
    'underscore',
    'backbone',
    'marionette',
    'app',
    'routers/adminRouter',
    'routers/userRouter',
    ], function($, _, Backbone, Marionette, App, AdminRouter, UserRouter){

App.vent.on("routing:started", function(){
    Backbone.history.start();
});

App.addInitializer(function(){
    if(userRole==="admin"){
        App.Router = new AdminRouter;
    } else {
        App.Router = new UserRouter;
    }
    App.vent.trigger("routing:started");
});

App.addRegions({
   content: "#main",
   page: "#page",
   dialogs: "#dialogs"
});

App.start();

App.vars = {};

App.vars.userRole = userRole;

App.js 只是:

define([
   'underscore',
   'backbone',
   'marionette'
   ], function(_, Backbone){

       var App = new Backbone.Marionette.Application();
       return App;
});

变量userRole只是一个全局变量,我在 index.php 页面上从我的服务器引导。这个安全多少?有没有办法改变userRole页面加载的值?或者App.vars.userRole在应用程序运行时进行更改?我无法App从控制台访问变量,但正如我所说,我对客户端编程很陌生,我必须知道我是否可以依赖该变量的值。处理这种情况的最佳方法是什么?先感谢您。

4

2 回答 2

5

@devundef 说的是真的。有了安全性,您的所有授权都必须发生在服务器端。一旦代码被加载到客户端并在野外,没有什么能阻止他们通过和改变它......以你不喜欢的方式。在某些情况下,它可能需要付出更多的努力(例如,如果你缩小它更难阅读的东西),但它绝对是可行的,所以根本不应该依赖这样的东西。

只要您正在检查服务器端,坏客户端是否会这样做并不重要。例如,您可以将您的 userRole 作为一个便利变量,用于指示您的客户端应用程序的行为方式。他们可能会恶意更改 userRole,给自己一个假的管理员状态,这使他们可以访问管理员视图,但是当他们想做其他事情时(例如从服务器获取数据等),他们的游戏时间就结束了。这通常是什么它归结为。基本上,您想要保护需要特定授权(如管理员状态)的操作(GET、POST、PUT、DELETE)。服务器上的任何敏感路由都必须在完成请求之前进行此类检查。

同样,当客户端发送 userRole = admin 时,您不能信任。您需要首先验证他们是他们声称的用户,然后再授权该用户是否具有适当的权限(如管理员状态)。每一次。

我使用加密的 cookie 会话。用户通过身份验证后,会得到不可篡改的cookie。因此,每次他们提出请求时,我都会使用该 cookie 说“好吧,这确实是用户 X”。一旦我有了它,我就会进行数据库查找以说“好的,他是管理员”。如果检查成功,我可以满足要求。如果没有,我会给他们一个粗鲁的错误。

如果没有某些特权的人可能无法访问某些模型、视图和集合,我不确定最好的方法是什么。通常我唯一关心的是数据库中的原始数据。但是,我实际上可能会编译几种不同的客户端应用程序(例如,一种用于一般用户,一种仅用于管理员)并根据它们在索引时的状态提供适当的一种。好吧,老实说,我什至不会让初始请求访问相同的 url。程序仍然是相同的。1) 认证和 2) 授权。

于 2012-09-08T15:43:12.947 回答
2

因此,只要您将userRole其作为全局变量放在页面上,它就可以从您身边运行的其他脚本中更改。并且当您在其中使用对全局变量的引用时,AppApp.vars.userRole也会发生变化。您可以制作深拷贝userRole来防止这种情况。

但这只是一个理论上的问题。如果有人在您这边成功运行了它的脚本,那么您会遇到更大的问题,因为他可以使用登录用户调用您的 API。

我已经使用在初始 HTML 有效负载中呈现登录用户模型的方法构建了大型单页应用程序,并且效果很好。正如评论中提到的,所有安全部分都必须在后端完成。

于 2012-09-08T18:02:32.827 回答