1.首先在表单提交页面生成校验使用的Token

  1. public ActionResult Index()
  2. {
  3. //Token验证需要使用的token
  4. string token = System.Guid.NewGuid().ToString();
  5. this.HttpContext.Session["Token"] = token;
  6. ViewBag.token = token;
  7. return View();
  8. }

2.视图页面在表单作用域下建立隐藏域

  1. <input type="hidden" name="hiddenToken" id="hiddenToken" value="@ViewBag.token" />

3.建立验证Token逻辑的特性标签

  1. public class PlatformActionFilter : FilterAttribute, IActionFilter
  2. {
  3. public PlatformActionFilter()
  4. {
  5.  
  6. }
  7. public void OnActionExecuting(ActionExecutingContext filterContext)
  8. {
  9. string httpMethod = filterContext.RequestContext.HttpContext.Server.HtmlEncode(filterContext.RequestContext.HttpContext.Request.HttpMethod);
  10.  
  11. if (httpMethod == "POST")
  12. {
  13. // page token
  14. // hiddenToken
  15. string cacheToken = filterContext.HttpContext.Request["hiddenToken"];
  16. var session = System.Web.HttpContext.Current.Session["Token"];
  17. //filterContext.HttpContext.Request.IsAjaxRequest()
  18. if (session != null)
  19. {
  20. if (cacheToken == session.ToString())
  21. {
  22. System.Web.HttpContext.Current.Session["Token"] = "Success";
  23. Logger.LogHelper.WriteErrorLog("提交成功!");
  24. }
  25. else
  26. {
  27. System.Web.HttpContext.Current.Session["Token"] = "Erro";
  28. Logger.LogHelper.WriteErrorLog("请不要重复提交!");
  29. }
  30. }
  31. }
  32. }
  33. public void OnActionExecuted(ActionExecutedContext filterContext)
  34. {
  35.  
  36. }
  37. }

4.提交控制器做验证判断token值是否为Success

  1. [HttpPost]
  2. [PlatformActionFilter]
  3. public ActionResult Register(Users Usdata)
  4. {
  5. if (this.HttpContext.Session["Token"].ToString() == "Erro")
  6. {
  7. return WriteError("请不要重复提交!");
  8. }
  9. //这里写正常的业务逻辑和返回
  10. return WriteSuccess("注册成功!");
  11. }

整个流程的验证思路就是在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,通过过滤器的标签验证session是否合法,然后正常处理数据。除非走正常逻辑先进入到表单提交页面,然后才能正常处理Post请求。

还有就是检查HttpContext.Request.UserAgent

  1. if (HttpContext.Request.UserAgent == "Fiddler")
  2. {
  3. WriteError("请求非法");
  4. }

防止XSRF 解决方案的更多相关文章

  1. asp.net MVC 常见安全问题及解决方案

    asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session rid ...

  2. IIS安全工具UrlScan介绍 ASP.NET 两种超强SQL 注入免费解决方案( 基于IIS,使用免费工具) 批改或隐藏IIS7.5的Server头信息 移除X-Powered-By,MVC,ASP.NET_SessionId 的 HTTP头或者cookie名称

    微软给了我们一个很好的工具用来使IIS安全的运行-------UrlScan,下面是它的配置文件介绍 [options]UseAllowVerbs=1                ; 若为1,则使用 ...

  3. 常见web安全隐患及解决方案

    Abstract 有关于WEB服务以及web应用的一些安全隐患总结资料. 1. 常见web安全隐患 1.1.       完全信赖用户提交内容 开发人员决不能相信一个来自外部的数据.不管它来自用户提交 ...

  4. 如何防止XSRF攻击

    XSRF全称是 cross-site request forgery(跨站点请求伪造),也称为CSRF,是一种常见的web攻击方式. 攻击形式描述如下: 1.用户登录并访问一个正常的站点 http:/ ...

  5. [转]asp.net MVC 常见安全问题及解决方案

    本文转自:http://www.cnblogs.com/Jessy/p/3539564.html asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request ...

  6. CSRF/XSRF 跨站请求伪造

    CSRF/XSRF 跨站请求伪造 CSRF(Cross Site Request Forgery, 跨站域请求伪造)也称 XSRF, 是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安 ...

  7. 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)

    https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...

  8. 常见web安全隐患及解决方案(转)

      Abstract 有关于WEB服务以及web应用的一些安全隐患总结资料. 1. 常见web安全隐患 1.1.       完全信赖用户提交内容 开发人员决不能相信一个来自外部的数据.不管它来自用户 ...

  9. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

随机推荐

  1. mailstats - 显示邮件状态信息

    总览 mailstats [-o] [-C cffile] [-f stfile] 描述 mailstats工具显示当前的邮件状态信息. 首先,先显示统计启动时所记录的时间,当然是以ctime(3)所 ...

  2. Linux架构之Nginx 常见问题

    第54章 Nginx常见问题 一.Nginx多Sever优先级 在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中每个server的server_n ...

  3. Flask 框架app = Flask(__name__) 解析

    #!/usr/local/bin/python # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') ...

  4. GUI学习之二十二——QRubberBand学习总结

    今天学习一种全新的输入控件——QRubberBand()控件(橡皮筋选中) 一.描述 QRubberBand()提供了一个矩形或西安来只是选择或边界的效果(就像在桌面上点击鼠标后拖拽拉出来的框一样), ...

  5. JVM GC Roots

    如何确定一个堆中的对象是否死去? 两个思路: 1.引用计数法 给每个对象添加一个引用,用来统计指向该对象的引用计数.有引用时就加1,引用失效时就减1.任何时候引用计数为0,该对象就死亡了.可以被当做垃 ...

  6. MyEclipse使用教程:使用Workbench和Perspectives

    [MyEclipse CI 2019.4.0安装包下载] workbench指的是加载IDE时看到的内容,它通常包含一个perspective,这是相关视图和编辑器的布局.您可以根据正在进行开发的类型 ...

  7. ubuntu重装--备份/配置

    https://github.com/wenlin-gk/document/blob/master/ubuntu%E5%A4%87%E4%BB%BD%2B%E9%85%8D%E7%BD%AE.txt

  8. day02项目配置代码

    一.maven相互依赖结构 1.parent(pom)[父类]2.common(jar)[工具类]3.pojo(jar)[实体类] 依赖 common(jar)4.dao(jar)[CRUD] 依赖 ...

  9. Oracle RAC数据泵导出问题处理

    1. 设置导出文件路径 sqlplus / as sysdba SQL> alter session set container=spdb1pdb; SQL> create directo ...

  10. 使用mongodb

    1.安装 yarn add moogose 2.启动 在命令行 mongod --dbpath D:\data//这是最后出现 waiting for connections on port 2701 ...