可能我们大多数人做web的时候不会太注意这个问题,但是这是一个很重要的一个点。我们写代码写业务的时候也应该从各方面多思考。

首先就是先简单介绍下什么是CSRF

CSRF 全程是 Cross-site request forgery 中文意思就是跨站请求伪造。和跨站脚本XSS不同,XSS的特点是利用站内受信任的用户,将代码植入到提供给其它用户使用的页面中,但是CSRF的特点是利用你的身份去做一些服务端认为合法的请求。可能我们很多人都会出现qq空间被莫名的发好多广告信息,他的流程就是 比如说我们登陆了一个网站 ,一些认证信息保存再cookie中,因为session也就是根据cookie的机制来实现的,当别人拿到这些cookie的时候 就可以利用cookie来做服务端认为合法的事情,发广告帖什么的。

防范方式也有很多 在MVC中可以通过ValidateAntiForgeryToken这个特性来做到这一点。同时 这个特性只针对post请求,这个特性的作用就是阻止伪造请求。代码如下:

        [HttpPost]
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Login(string name,string pwd)
{
if (name==pwd)
{
return RedirectToAction("Index");
}
ModelState.AddModelError("", "用户名密码错误!");
return View();
}

 这时候我们构造一个请求,表单提交,就会抛出这样的错误信息

其实到这一步我们的初步目标就达到了,在本站点中,我们在提交表单的时候,需要使用到Html.AntiForgeryToken()

这个玩意写在我们的form标签里,他的作用就是在form标签里面加一个name为__RequestVerificationToken的hidden标签,这个标签的value就是一串被加密的字符串。

加密器是MachineKey。同时这玩意还生成了一个名为__RequestVerificationToken的cookie。

  @using (Html.BeginForm("Login", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="form-group">
<label class="label-danger">用户名:</label>
<input type="text" name="name" />
</div>
<div class="form-group">
<label class="label-danger">密码:</label>
<input type="text" name="pwd" />
</div>
<div class="form-group">
<button type="submit" class="btn-primary">登陆</button>
</div>
}

  

这时候我们就可以构造合法且相对安全的请求了。

总结一下 csrf 就是别人利用你的身份进行恶意操作。

而我们在MVC中的应对之道就是别form表单里面使用  @Html.AntiForgeryToken()

这玩意的作用就是通过MachineKey加密从而生成了一个hidden标签以及写入cookie

在Controller里面,Action加上 [ValidateAntiForgeryToken]特性从而验证。

流程就是如此。

MVC防止CSRF攻击的更多相关文章

  1. ASP.NET MVC 防止CSRF攻击

    简介 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cr ...

  2. asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解

    一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...

  3. Spring mvc拦截器防御CSRF攻击

    CSRF(具体参考百度百科) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSR ...

  4. MVC Html.AntiForgeryToken() 防止CSRF攻击

    转自:http://blog.csdn.net/cpytiger/article/details/8781457 一.MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(C ...

  5. MVC 应用免受 CSRF攻击

    保护ASP.NET 应用免受 CSRF 攻击   CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack ...

  6. 转:MVC Html.AntiForgeryToken() 防止CSRF攻击

    (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...

  7. .NET MVC中的防CSRF攻击

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  8. Asp.net MVC 如何防止CSRF攻击

    什么是CSRF攻击? CSRF(Cross-site request forgery跨站请求伪造,也被称成为"one click attack"或者session riding,通 ...

  9. [转]MVC Html.AntiForgeryToken() 防止CSRF攻击

    [转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...

随机推荐

  1. win10 vscode使用 智能提示

    1.没有第三方库的智能提示 参考:https://code.visualstudio.com/docs/python/editing 1.点开Settings 2.搜索加添加 3.添加后的内容 然后就 ...

  2. javascript---split 和 join 的区别

    //相同点 : split 和 join 都是对字符或字符串进行操作的 //split(切割字符串) : 把字符串根据切割符切割,返回数组 //第一个参数 分隔符 //第二个参数 返回数组中元素的个数 ...

  3. ArcMap AddIn之下载ArcGIS Server地图服务中的数据

    涉及到开发知识点1.ArcGIS Server地图服务 2.C# web请求获取数据 3.AddIN开发技术 工具界面: 具体涉及到的代码之后有空贴出来.先上工具 AddIn插件下载地址:点击这里下载 ...

  4. SELECT 语句

    常见表的操作 查看数据库的表   show  table 查看表结构     desc 表名 删除表   drop table表 修改表的结构 添加列  alter   table 表名 add 列名 ...

  5. angular.js学习笔记(一)

    1.angular单项数据绑定 2.不要使用控制器的时候: 任何形式的DOM操作:控制器只应该包含业务逻辑.DOM操作则属于应用程序的表现层逻辑操作,向来以测试难度之高闻名于业界.把任何表现层的逻辑放 ...

  6. layui 表格内容显示更改

    在cole 中使用temple 属性进行修改 例: table.render({ elem: '#messageTable' ,id: 'search_table_mId' ,height: 500 ...

  7. 手机touch事件及参数【转】(自己懒得写了,找了一篇摘过来)

    [html5构建触屏网站]之touch事件 前言 一个触屏网站到底和传统的pc端网站有什么区别呢,交互方式的改变首当其冲.例如我们常用的click事件,在触屏设备下是如此无力. 手机上的大部分交互都是 ...

  8. Javascript高级编程学习笔记(88)—— Canvas(5)绘制文本

    绘制文本 同样的,canvas也为绘制文本提供了相应的方法. 2D上下文提供的文本绘制方法主要有两个: fillText() strokeText() 这两个方法都接受四个参数 要绘制的文本字符串 绘 ...

  9. C 基于数组存储的堆栈实现

    一.堆栈简介 对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(Stack). 堆栈可以认为是具有一定约束的线性表,插入和删除都作用在一个称为栈顶( ...

  10. [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...