博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A2D JS框架 - Web API CSRF保护实现
阅读量:6688 次
发布时间:2019-06-25

本文共 3134 字,大约阅读时间需要 10 分钟。

这次自己实现了类似jQuery中ajax调用的方法,并且针对RESTFul进行了改造和集成,实现的A2D AJAX接口如下: 

$.ajax.RESTFulGetCollection("/api/Users", function (data) { alert(data[5].FirstName); });$.ajax.RESTFulGetOne("/api/Users/1", function (data) { alert(data.UserID); });$.ajax.RESTFulDelete("/api/Users/1", function (data) { alert("deleted"); });$.ajax.RESTFulPost("/api/Users", { UserID: 0, FirstName: "aa", LastName: "bbb"}, function (data) { alert("added"); });$.ajax.RESTFulPut("/api/Users/1", { UserID: 0, FirstName: "aa", LastName: "bbb"}, function (data) { alert(data); });

 

我们再深入点,要是别人恶意访问Delete的url呢?比如CSRF攻击。普通webform或者普通MVC方式可以比较方便的阻止攻击, 方法参考的A8章节

答案:使用http header来传递token。步骤如下(以A2D与ASP.NET WEBAPI配合为例):

@functions{        public string TokenHeaderValue()        {            string cookieToken, formToken;            AntiForgery.GetTokens(null, out cookieToken, out formToken);            return cookieToken + ":" + formToken;                        }    }    $.ajax.Config.CSRFToken="@TokenHeaderValue()";    //把生成的token赋给A2D的ajax    $.ajax.RESTFulGetCollection("/api/Users", function (data) { alert(data[5].FirstName); });    $.ajax.RESTFulGetOne("/api/Users/1", function (data) { alert(data.UserID); });    $.ajax.RESTFulDelete("/api/Users/1", function (data) { alert("deleted"); });    $.ajax.RESTFulPost("/api/Users", { UserID: 0, FirstName: "aa", LastName: "bbb"}, function (data) { alert("added"); });    $.ajax.RESTFulPut("/api/Users/1", { UserID: 0, FirstName: "aa", LastName: "bbb"}, function (data) { alert(data); });

 

然后编写webapi的handler:

public class CSRFHandler : DelegatingHandler    {        protected override System.Threading.Tasks.Task
SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { if (request.Method == HttpMethod.Post || request.Method == HttpMethod.Put || request.Method == HttpMethod.Delete)//这里csrf只针对这3种请求才会验证 { ValidateRequestHeader(request); } return base.SendAsync(request, cancellationToken); } private void ValidateRequestHeader(HttpRequestMessage request) { string cookieToken = ""; string formToken = ""; IEnumerable
tokenHeaders; if (request.Headers.TryGetValues("A2D-CSRFToken", out tokenHeaders)) //这个header值要和A2D框架中的一致 { string[] tokens = tokenHeaders.First().Split(':'); if (tokens.Length == 2) { cookieToken = tokens[0].Trim(); formToken = tokens[1].Trim(); } } AntiForgery.Validate(cookieToken, formToken); } }

 

最后在WebApiConfig中注册这个handler

public static class WebApiConfig    {        public static void Register(HttpConfiguration config)        {            config.MessageHandlers.Add(new CSRFHandler());            config.Routes.MapHttpRoute(                name: "DefaultApi",                routeTemplate: "api/{controller}/{id}",                defaults: new { id = RouteParameter.Optional }            );        }    }

 

好了,都搞定了。

code .

 

 

 

转载地址:http://zezoo.baihongyu.com/

你可能感兴趣的文章
centos7.2源码安装php7.0.9和nginx1.10.3服务器
查看>>
[php]php连mysql出错:Call to undefined function mysql_connect()
查看>>
strtolower() 函数
查看>>
MongoDB查询返回指定键
查看>>
SQL Server 2017 AlwaysOn on Linux 配置和维护(12)
查看>>
SQL Server 2017 AlwaysOn on Linux 配置和维护(18)
查看>>
我的友情链接
查看>>
EBB-20、远程连接和文件ACL
查看>>
我的友情链接
查看>>
如何在Notepad++启用opera浏览器?
查看>>
C# extern 修饰符的用法
查看>>
Zabbix修正错误两例(只提供解决思路)
查看>>
Redhat6.X 配置HP3PAR7200存储多路径过程
查看>>
Java基础系列19:使用JXL或者POI生成和解析Excel文件
查看>>
【NetApp】console和SP的相互切换
查看>>
301错误_302错误_404错误_500错误等
查看>>
PHP内核介绍及扩展开发指南—Extensions 的编写
查看>>
修改grub2安装双系统的windows引导
查看>>
zabbix 自定义邮件报警
查看>>
DNS服务器原理及架设
查看>>