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

    提交成功

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

  • 相关阅读:
    [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
    [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
    [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”
    [安卓] 17、一个简单的例子学安卓侧滑设计——用开源slidingmenu
    [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果
    mysql常用处理时间的相关函数
    Mysql中HAVING的相关使用方法
    mysql中常见正则表达式的应用
    Linux系统模拟发送HTTP的get和post请求
    mysql删除字符串的前后的空格
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/6761214.html
Copyright © 2020-2023  润新知