我开始构建/设计一个新的单页 Web 应用程序,并且真的想主要使用客户端技术(HTML、CSS、JavaScript/CoffeScript)作为前端,同时拥有一个瘦 REST API 后端来提供数据到前端。出现的一个问题是关于 JavaScript 的安全性。例如,某些链接和 UI 元素将仅根据用户附加的角色和资源显示。当用户登录时,它将进行一个 REST 调用来验证凭据,然后返回一个 json 对象,该对象具有该用户的所有权限,该对象将存储在一个 JavaScript 对象中。
让我们来看看这段 javascript:
// Generated by CoffeeScript 1.3.3
(function() {
var acl, permissions, root;
root = typeof exports !== "undefined" && exports !== null ? exports : this;
permissions = {
//data…
};
acl = {
hasPermission: function(resource, permission, instanceId) {
//code….
}
};
root.acl = acl;
}).call(this);
现在这个代码设置确保即使通过控制台,也没有人可以修改变量权限。这里的问题是,由于这是一个单页应用程序,我可能想要更新权限而不必刷新页面(也许他们添加了一条记录,然后需要将其添加到他们的权限中)。我能想到的唯一方法是添加类似
setPermission: function(resource, permission, instanceId){
//code…
}
到 acl 对象,但是如果我这样做,这意味着浏览器控制台中的某个人也可以使用它来为自己添加他们不应该拥有的权限。有没有办法添加无法从浏览器控制台访问但可以从 JavaScript 文件中的代码访问的代码?
现在即使我可以防止上述问题,我仍然有一个更大的问题。无论我需要什么拥有 hasPermission 功能,但是当它以这种方式声明时,我可以在浏览器控制台中通过执行以下操作覆盖该方法:
acl.hasPermission(resource, permission, instanceId){return true;}
现在我可以看到一切了。无论如何定义此方法是用户无法覆盖它的方式(例如将其标记为最终或其他东西)?
需要注意的是,每个 REST API 调用也会检查权限,所以即使他们看到了他们不应该看到的东西,他们仍然无法做任何事情,并且 REST API 会因为权限问题而后悔请求. 有人建议在服务器端生成模板,但我真的不喜欢这个想法,因为它在前端和后端技术堆栈之间创建了非常强的耦合。例如,如果出于某种原因我们需要将 PHP 迁移到 Python 或 Ruby,如果模板是在客户端用 JavaScript 构建的,我只需要重新构建 REST API,所有前端代码都可以保留相同,但如果我在服务器端生成模板,情况并非如此。