关于这个Haacked博客,我对于实施提议的反JSON GET劫持解决方案犹豫不决
减轻JSON劫持的推荐解决方案涉及到GET数据的非REST完整JSON POST
备用解决方案(对象包装)导致第三方控件出现问题,我没有源代码访问权限.
我找不到一个社区审查的实现,它实现了如何组成安全令牌或在网页中安全地传递安全令牌的替代解决方案(如下所列).我也不会声称只有专家来推动我自己的实施.
不能依赖推荐人标题
背景
此博客描述了有关JSON劫持的CSRF问题,并建议使用JSON POST来获取数据.由于使用HTTP POST来获取GET数据并不是非常REST,我会寻找一个更多的RESTfull解决方案,它可以在每个会话或每页上启用REST操作.
另一种缓解技术是将JSON数据包装在对象中,如此处所述.我担心这可能会延迟这个问题,直到找到另一种技术.
替代实施
对我来说,使用jQuery HTTP GET为我的JSON 扩展使用ASP.NET MVC的AntiForgeryToken似乎很自然.
例如,如果我获取一些敏感数据,根据上面的Haacked链接,以下代码容易受到攻击:
$.getJSON('[url]', { [parameters] }, function(json) {
// callback function code
});
Run Code Online (Sandbox Code Playgroud)
我同意使用推荐的POST解决方法来获取数据不是RESTfull.我的想法是在URL中发送验证令牌.这样,CSRF式攻击者就不会知道完整的URL.缓存或不缓存,他们将无法获取数据.
下面是两个如何完成JSON GET查询的示例.我不确定哪种实现最有效,但可能猜测第一种实现更安全,因为错误的代理缓存了这些数据,因此容易受到攻击者的攻击.
HTTP://本地主机:54607 /首页/ AdminBalances/ENCODEDTOKEN-TOKEN-HERE
要么
HTTP://本地主机:54607 /首页/ AdminBalances ENCODEDTOKEN-TOKEN-这里?
...也许是MVC3的AntiForgeryToken,或者是变种(见swt).此标记将设置为上面选择的任何URL格式的内联值.
示例问题阻止我推出自己的解决方案
什么URL格式(上图),你会用它来验证JSON GET(斜杠,问号等)将代理来响应通过http://本地主机:54607 /首页/ AdminBalances与HTTP://本地主机:54607 /首页/ AdminBalances? ENCODEDTOKEN-TOKEN-HERE数据?
您如何将该编码令牌传递到网页?内联,还是作为页面变量?
你会如何撰写令牌?内置AntiforgeryToken还是通过其他方式?
AntiForgeryToken使用cookie.在这种情况下是否会使用/需要支持cookie?仅HTTP?SSL只与HTTP配合使用?
您将如何设置缓存标头?Google Web Accelerator的任何特殊功能(例如)
只是使JSON请求SSL有什么含义?
为了安全起见,返回的JSON数组是否仍然包装在对象中?
该解决方案将如何与Microsoft提出的模板和数据绑定功能互操作
上面提出的问题是我自己没有提前做这件事的原因.更不用说可能还有更多我没有想到的问题,但却存在风险.
我需要在用户关闭选项卡或浏览器时注销用户,我该如何在ASP.NET MVC中执行此操作?