goo*_*ate 20 json csrf antiforgerytoken asp.net-mvc-3
关于这个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提出的模板和数据绑定功能互操作
上面提出的问题是我自己没有提前做这件事的原因.更不用说可能还有更多我没有想到的问题,但却存在风险.
m0s*_*0sa 16
Asp.net MVC AntiForgeryToken不能通过HTTP GET工作,因为它依赖于依赖HTTP POST的cookie(它使用OWASP XSRF 预防备忘单中描述的" Double Submit Cookies "技术).您还可以通过设置为httponly来保护发送到客户端的cookie,这样就不会通过脚本欺骗它们.
在本文档中,您可以找到可用于防止XSRF的各种技术.您所描述的似乎属于方法1.但是我们在使用Ajax HTTP GET请求时如何在服务器上检索会话时遇到问题,因为cookie不随请求一起发送.所以你还需要为你的动作的URL添加一个会话标识符(也就是那些更容易被劫持的cookieless会话).因此,为了执行攻击,攻击者只需知道正确的URL即可执行GET请求.
也许一个好的解决方案是使用用户SSL证书中的某些密钥存储会话数据(例如certs thumb-print).这样,只有SSL证书的所有者才能访问其会话.这样您就不需要使用cookie,也不需要通过查询字符串参数发送会话标识符.
无论如何,如果您不想在Asp.net MVC中使用HTTP POST,则需要推出自己的XSRF保护.
我遇到了这个问题,解决方案并不是那么简单,但是有一个很棒的博客可以帮助您入门,它可以与 get 和 post ajax 一起使用。
http://johan.driessen.se/posts/Updated-Anti-XSRF-Validation-for-ASP.NET-MVC-4-RC
如果您将以下内容放在全局名称空间中,您的所有帖子/获取都可以利用具有防伪令牌的优势,并且您不必修改您的 ajax 调用。在公共页面中创建输入元素。
<form id="__AjaxAntiForgeryForm" action="#" method="post">@Html.AntiForgeryToken()</form>
Run Code Online (Sandbox Code Playgroud)
以下 javascript 将读取防伪令牌并将其添加到请求标头中。
// Wire up the global jQuery ajaxSend event handler.
$(document).ajaxSend(namespace.ajax.globalSendHandler);
// <summary>
// Global handler for all ajax send events.
// </summary>
namespace.ajax.globalSendHandler = function (event, xhr, ajaxOptions) {
// Add the anti forgery token
xhr.setRequestHeader('__RequestVerificationToken', $("#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]").val());
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19704 次 |
最近记录: |