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

最新文章

  1. insertion sort(插入排序)
  2. 【转】CSS z-index 属性的使用方法和层级树的概念
  3. Shell脚本学习入门(一)
  4. 喝咖啡写脚本,顺便再加一点点CSS语法糖 2.五分钟学会Less
  5. Java 中带参带返回值方法的使用
  6. Linux安装Monaco字体
  7. Go语言的构建方法总结
  8. 京东区块排版负margin用法
  9. mahout源码KMeansDriver分析之五CIMapper
  10. html5实现滚动文字
  11. Linux程序写入oralce数据库中文显示为问号??? 代码实现设置环境变量!
  12. JFreeChart时间轴固定24小时每天刷新
  13. 理解面向过程(OPP)、面向对象(OOP)、面向切面(AOP)
  14. 【github&amp;&amp;git】6、SmartGit(试用期30后),个人继续使用的方法。
  15. Maven 安装 on centos7
  16. 51Nod 1443 路径和树
  17. Spring 3 Java Based Configuration with @Value
  18. 机器Coding For WinForm
  19. TP条件查询和分页查询
  20. 【教程】手写简易web服务器

热门文章

  1. Oracle学习笔记:实现select top N的方法
  2. jenkins Error performing command: git ls-remote -h
  3. 一步一步学习IdentityServer4 (4) 处理特殊需求之-登录等待页面
  4. xtrabckup备份报错:Failed to connect to MySQL server: Can&#39;t connect to local MySQL server through socket &#39;/data/mysql/mysql.sock&#39; (2).
  5. Spark(四)Spark之Transformation和Action
  6. bzoj 1826
  7. 极简操作无需root隐藏S8导航栏和状态栏
  8. shell心得
  9. 分享实用的JavaScript代码库
  10. 9-4 Unidirectional TSP uva116 (DP)