Javascript Requirejs、主干网和安全

Javascript Requirejs、主干网和安全,javascript,security,backbone.js,requirejs,Javascript,Security,Backbone.js,Requirejs,事实上,我正在为我的公司开发一个单页应用程序,它涉及不同用户角色的不同视图,以防止没有足够权限的人访问他们不应该看到的数据或执行他们无权执行的功能 我在后台使用带有RESTAPI的PHP,因此我认为我在那里相当安全,但我对客户端安全性一无所知 我正在考虑在我的main.js中存储一个具有当前用户角色的应用程序变量,如下所示: require(['jquery', 'underscore', 'backbone', 'marionette', 'app',

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

我在后台使用带有RESTAPI的PHP,因此我认为我在那里相当安全,但我对客户端安全性一无所知

我正在考虑在我的main.js中存储一个具有当前用户角色的应用程序变量,如下所示:

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?我无法从控制台访问应用程序变量,但正如我所说,我对客户端编程非常陌生,我必须知道是否可以依赖该变量的值。处理这种情况的最好方法是什么?提前谢谢。

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

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

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

我使用加密的cookie会话。在用户认证后,他们得到了不能篡改的cookie。所以每次他们提出请求时,我都会用那个cookie来表示同意,这确实是用户X。一旦我有了那个cookie,我就会进行数据库查找来表示同意,他就是管理员。如果这一点得到证实,我可以满足这个要求。如果不是,我就给他们一个粗鲁的错误


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

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

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

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

我使用加密的cookie会话。在用户认证后,他们得到了不能篡改的cookie。所以每次他们提出请求时,我都会用那个cookie说OK,这确实是用户X。一旦我有了那个cookie,我就会进行DB查找,说OK,他就是 管理员。如果这一点得到证实,我可以满足这个要求。如果不是,我就给他们一个粗鲁的错误

如果某些模型、视图和集合不应该被没有特定权限的人访问,我不确定最好的方法是什么。通常我唯一关心的是数据库中的原始数据。但是,实际上我可能会编译几个不同的客户端应用程序,例如,一个用于普通用户,一个仅用于管理员,并根据他们访问索引时的状态提供相应的应用程序。老实说,我甚至不会让最初的请求命中相同的url。不过程序还是一样的。1进行身份验证,2进行授权。

因此,只要您将userRole作为全局变量放在页面上,它就可以从您这边运行的其他脚本中更改。当你在App中引用全局变量时,App.vars.userRole也会改变。您可以制作一个深度拷贝userrole来防止这种情况

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

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

因此,只要您将userRole作为全局变量放在页面上,它就可以从您这边运行的其他脚本中更改。当你在App中引用全局变量时,App.vars.userRole也会改变。您可以制作一个深度拷贝userrole来防止这种情况

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


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

安全性是在服务器端完成的。在客户端,您只需配置视图。因此,如果用户试图访问他支持的不应该看到的资源,服务器必须阻止访问。永远不要相信客户!是的,我想,我正在我的服务器api上添加所需的安全性检查。如果可能的话,我只是想知道避免客户端出现故障的最佳方法。@Igro,我怀疑这是不可能的,用户可以打开js控制台做任何他想做的事情。我在一个有10个角色的项目中工作,我们发现为每个角色创建一个包js文件是值得的——它不会“提高安全性”,但更易于管理,有助于避免断开链接/路由/视图,因为我们没有管理客户端中的路由,只加载该角色所需的模块。尼斯建议@devundef,我现在只有3个角色,但我喜欢分离的方法,它将有助于保持事情的清洁。安全是在服务器端。在客户端,您只需配置视图。因此,如果用户试图访问他支持的不应该看到的资源,服务器必须阻止访问。永远不要相信客户!是的,我想,我正在我的服务器api上添加所需的安全性检查。如果可能的话,我只是想知道避免客户端出现故障的最佳方法。@Igro,我怀疑这是不可能的,用户可以打开js控制台做任何他想做的事情。我在一个有10个角色的项目中工作,我们发现为每个角色创建一个包js文件是值得的——它不会“提高安全性”,但更易于管理,有助于避免断开链接/路由/视图,因为我们没有管理客户端中的路由,只加载该角色所需的模块。尼斯建议@devundef,我现在只有3个角色,但我喜欢分开的方式,这将有助于保持事情的清洁。感谢关于深度复制的提示!谢谢你的提示关于深拷贝!感谢您的澄清,现在我只需要考虑如何保持客户端的整洁。我想我会按照你和@devundef建议的不同角色使用不同的应用程序。谢谢你的澄清,现在我只需要考虑如何保持客户端的整洁。我想我会按照你和@devundef建议的不同角色使用不同的应用程序。