[Asp.net MVC]Html.AntiForgeryToken()

栏目: 编程语言 · ASP.NET · 发布时间: 6年前

内容简介:[Asp.net MVC]Html.AntiForgeryToken()

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();
        }
    }

[Asp.net MVC]Html.AntiForgeryToken()

提交成功

[Asp.net MVC]Html.AntiForgeryToken()

此时提供给了跨站攻击的漏洞,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>

发起攻击

[Asp.net MVC]Html.AntiForgeryToken()

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

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进行提交

[Asp.net MVC]Html.AntiForgeryToken()

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

[Asp.net MVC]Html.AntiForgeryToken()

[Asp.net MVC]Html.AntiForgeryToken()

为了验证一个来自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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品经理必懂的技术那点事儿:成为全栈产品经理

产品经理必懂的技术那点事儿:成为全栈产品经理

唐韧 / 电子工业出版社 / 2018-1 / 59

《产品经理必懂的技术那点事儿:成为全栈产品经理》以非技术背景产品经理学习技术为主题,将技术知识以简单并且易于理解的方式讲述出来,帮助非技术背景产品经理了解技术、学习技术,旨在帮助产品经理高效地与技术人员进行沟通与合作,避免不懂技术带来的困扰。 《产品经理必懂的技术那点事儿:成为全栈产品经理》主要内容围绕产品经理需要了解的互联网基础技术知识展开,涉及客户端、服务器端、数据库及一些数据处理知识。......一起来看看 《产品经理必懂的技术那点事儿:成为全栈产品经理》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具