CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。(百度百科)

一个场景

加入有这样一个发布公司新闻的页面

@{
ViewBag.Title = "News";
} <h2>News</h2> @using (Html.BeginForm("PostNews", "News", FormMethod.Post))
{
<input type="text" name="content" id="content" />
<input type="submit" value="Submit" />
}

控制器

    public class NewsController : Controller
{
// GET: News
[HttpPost]
public ActionResult PostNews()
{
ViewBag.content = Request.Form["content"];
return View();
}
[HttpGet]
public ActionResult News()
{
return View();
}
}

提交成功

此时提供给了跨站攻击的漏洞,CSRF一般依赖几个条件

(1)攻击者知道该目标站点。

(2)攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie

(3)目标站点没有对用户在网站行为的第二授权。

比如我们现在知道发布新闻的地址:http://localhost:28401/News/PostNews

我们下面新建一个页面test.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form action="http://localhost:28401/News/PostNews" method="post">
<input type="hidden" name="content" value="你们公司网站被黑了" />
<input type="submit" name="name" value="提交" />
</form>
</body>
</html>

发起攻击

这样在公司站点的新闻列表就被篡改了。作为安全性考虑,这种情况肯定不会让它发生的,如果涉及到公司利益,那就损失大了。

MVC中如何防范?

还好,mvc中通过在页面上使用 Html.AntiForgeryToken()配合在对应的Action上增加[ValidateAntiForgeryToken]特性来防止跨站攻击。

修改上面提交代码

@using (Html.BeginForm("PostNews", "News", FormMethod.Post))
{
@Html.AntiForgeryToken()
<input type="text" name="content" id="content" />
<input type="submit" value="Submit" />
}
        [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PostNews()
{
ViewBag.content = Request.Form["content"];
return View();
}

我们这里再次使用test.html进行提交

我们看一下Html.AntiForgeryToken()会为当前请求,生成一个名为__RequestVerificationToken的cookie,还有一个名为__RequestVerificationToken的隐藏域。

为了验证一个来自form post请求,还需要在目标action上增加[ValidateAntiForgeryToken]特性,它是一个验证过滤器,它主要检查

(1)请求的是否包含一个约定的AntiForgery名的cookie

(2)请求是否有一个Request.Form["约定的AntiForgery名"],约定的AntiForgery名的cookie和Request.Form值是否匹配

总结

在asp.net mvc中,需要加上Html.AntiForgeryToken()防止CSRF攻击,在使用ajax进行post请求的时候,需要获取到名为__RequestVerificationToken的隐藏域的值进行一起提交。

参考

http://blog.csdn.net/cpytiger/article/details/8781457

[Asp.net MVC]Html.AntiForgeryToken()的更多相关文章

  1. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

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

  2. ASP.NET MVC中防止跨站请求攻击(CSRF)

    转载   http://kevintsengtw.blogspot.co.nz/2013/01/aspnet-mvc-validateantiforgerytoken.html 在 ASP.NET M ...

  3. [引]ASP.NET MVC 4 Content Map

    本文转自:http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx The Model-View-Controller (MVC) ...

  4. ASP.NET MVC AntiForgeryToken

    你开发一个网站,其中有个功能:新闻发布. 你是这样实现的: 1.保存新闻的方法是:/News/Save  POST提交 2.接受两个参数:title和content 有一天,你登录网站(浏览器会保存相 ...

  5. ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题

    在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...

  6. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  9. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

随机推荐

  1. Tango ROS Streamer

    谁想要在Android平台上编写机器人应用,或者谁希望扩展其与室内定位和3D感知新的传感器的机器人开发,Intermodalics创建的ROS Streamer应用的Tango. 这个Android应 ...

  2. WORDPRESS登录后台半天都无法访问或者是访问慢的解决方法

    wordpress登录后台如果打开速度慢,一般分为两部分,第一部分是php虚拟主机的原因,其中主机的原因,又分为很多种情况.第二部分就是WordPress程序本身的问题.这里无忧主机小编主要是讲第二部 ...

  3. abp zero 4.3 发布

    Demo URL: http://abpzerodemo.demo.aspnetzero.com Username: systemPassword: 123456 需要源码,请加QQ:3833-255 ...

  4. Spark(七)Spark内存调优

    一.概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文 ...

  5. linux系统host修改

    有时候我们需要修改主机的host主机名,方便管理和识别自己的服务器,修改步骤如下: 第一步: vi  /etc/hosts 正常情况下,修改了第一步就可以了,如果通过hostname命令查看还是修改以 ...

  6. USACO 5.5 Hidden Password

    Hidden Password ACM South Eastern Europe -- 2003 Sometimes the programmers have very strange ways of ...

  7. html5+css3 h5页面生成的思路

    <!DOCTYPE html><html style="height: 100%;"> <head> <meta charset=&quo ...

  8. strings.xml显示html格式

    需求:合同协议,其中指定内容为红色 效果图: 实现如下: <string name="learn_ticket_agreement" formatted="fals ...

  9. matplotlib 中文显示 的问题

    第一种方法 from pylab import mpl import numpy as np mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 ...

  10. 八皇后II

    用一个数组state记录已经选择的每一行皇后所在的位置,DFS count = 0 N = 8 state = [0]*N def dfs(row): global count for col in ...