Requirejs,Backbone和安全性

Ing*_*gro 1 javascript security requirejs backbone.js

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

我在后端使用PHP和REST API,所以我觉得我在那里相当安全,但我对客户端安全性一无所知.

我正在考虑在我的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;
Run Code Online (Sandbox Code Playgroud)

App.js只是:

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

       var App = new Backbone.Marionette.Application();
       return App;
});
Run Code Online (Sandbox Code Playgroud)

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

jmk*_*142 5

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

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

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

我使用加密的cookie会话.在用户进行身份验证后,他们会获得无法篡改的cookie.因此,每次他们提出请求时,我都会使用该Cookie说"好的,这确实是用户X".一旦我有了这个,我会进行数据库查询,说"好吧,他是一名管理员".如果检查出来,我可以完成请求.如果没有,我给他们一个粗鲁的错误.

如果没有某些特权的人可能无法访问某些MODELS,VIEWS和COLLECTIONS,我不确定最好的方法是什么.通常我唯一关心的是数据库中的原始数据.但是,我实际上可能会编译几个不同的客户端应用程序(例如,一个用于普通用户,一个仅用于管理员),并根据他们达到索引时的状态提供适当的应用程序.好吧,说实话,我甚至不会让初始请求达到相同的网址.但程序仍然是相同的.1)认证和2)授权.