现在我已对其进行了排序,我对垂直安全性感到非常头疼:一个用户登录但可以通过更改浏览器控制台中的一些参数轻松访问其他用户的信息.我可以在每次调用时传递userId,然后将其与服务器上的那个进行比较,但我希望有一个总体解决方案,不会污染用户ID的微风数据调用.
例如,假设有来自数据服务的调用,如下所示:
function getItems(){ var query = breeze.EntityQuery.from('Items').expand("Person"); return manager.executeQuery(query); }
这将得到所有项目,不好.所以让我们用userId来限制:
function getItems(userId){ var query = breeze.EntityQuery.from('Items').where("userId","==",authentication.userId).expand("Person"); return manager.executeQuery(query); }
在第二个示例中,我们从身份验证服务获取userId,该服务在用户登录时存储userId.但是,恶意用户可以轻松访问浏览器控制台并更改该值.
当然,我可以使用withParameters(…)传递userId并将其与服务器上的当前版本进行比较,但是我必须为每次调用执行此操作,这似乎不对.有没有更好的方法来保护具有可信用户ID的呼叫?
解决方法
例如,你研究过ASP.NET Breeze/Knockout Template吗?它使用Forms Auth进行身份验证,并使用[Authorize]属性保护Web API控制器.只有登录用户才能访问任何控制器方法.
该身份验证还设置Web API控制器通过其User属性提供的IPrincipal.您将看到User传递给TodoRepository的构造函数.在该存储库中,您将找到限制查询的保护逻辑,并将其保存到属于请求用户的Todo信息.
看看网络流量.您将无法在URL或请求/响应正文中找到任何用户标识信息.您将在标头中看到加密的身份验证cookie.
An obvIoUs flaw in the example is that the client/server traffic takes place in the clear. You must add transport level security (HTTPS) before you go to production. But this is a demo after all.