我实际上正在为我的公司开发一个单页应用程序,它涉及不同用户 Angular 色的不同 View ,以防止没有足够权限的人访问他们不应该看到的数据或执行他们没有的功能做的权利。
我在后端使用带有 REST api 的 PHP,所以我认为我在那里相当安全,但我对客户端安全性一无所知。
我正在考虑在我的 main.js 中以这种方式存储一个具有当前用户 Angular 色的 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 运行时更改 App.vars.userRole
?我无法从控制台访问 App
变量,但正如我所说,我是客户端编程的新手,我必须知道我是否可以依赖该变量的值。处理这种情况的最佳方法是什么?提前谢谢你。
最佳答案
@devundef 说的是真的。出于安全考虑,您的所有授权都必须在服务器端进行。一旦代码被加载到客户端并且在野外,就没有什么可以阻止他们通过并改变它......以你不喜欢的方式。在某些情况下,这可能需要付出更多的努力(例如,如果您缩小内容,它就更难阅读了),但这绝对是可行的,因此根本不应依赖此类内容。
只要您检查的是服务器端,恶意客户端执行此操作并不重要。例如,您可以将 userRole 作为一个方便的变量来指示您的客户端应用程序的行为方式。他们可能会恶意更改 userRole,给自己一个假的管理员身份,这使他们可以访问管理员 View ,但是当他们想做任何其他事情(例如从服务器获取数据等)时,他们的游戏时间就会结束。这通常是什么它归结为。基本上,您想要保护需要特定授权(例如管理员身份)的操作(GET、POST、PUT、DELETE)。服务器上的任何敏感路由在完成请求之前都必须进行此类检查。
同样,当客户端发送 userRole = admin 时,您不能相信。您要做的是首先需要验证他们是他们声称的用户,然后再授权该用户是否具有适当的权限(例如管理员身份)。每一次。
我使用加密的 cookie session 。用户通过身份验证后,他们将获得不可篡改的 cookie。因此,每次他们发出请求时,我都会使用该 cookie 说“好的,这确实是用户 X”。一旦我有了它,我就会进行数据库查找以说“好的,他是管理员”。如果检查通过,我可以满足要求。如果不是,我会粗鲁地给他们一个错误。
如果没有某些权限的人可能无法访问某些模型、 View 和集合,我不确定解决此问题的最佳方法是什么。通常我唯一关心的是数据库中的原始数据。但是,我实际上可能会编译几个不同的客户端应用程序(例如,一个供普通用户使用,一个仅供管理员使用)并根据它们在索引时的状态提供适当的应用程序。好吧,老实说,我什至不会让初始请求点击相同的 url。但是程序仍然是一样的。 1) 验证和 2) 授权。
关于javascript - Requirejs、主干和安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12330509/