zoukankan      html  css  js  c++  java
  • 【MVC整理】4.Asp.net MVC 如何防止CSRF攻击

    什么是CSRF攻击?

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

    详细说明:http://baike.baidu.com/view/1609487.htm

    CSRF攻击发生的场景:

           CSRF攻击依赖下面的假定:

      攻击者了解受害者所在的站点

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

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

    Asp.net MVC 内置了对CSRF进行防御的方法如下:

    1.在View的Form表间中使用

    <%=Html.AntiForgeryToken() %>

    例如:

     <% using (Html.BeginForm("Login", "Admin", FormMethod.Post))
           { %>
            <%=Html.AntiForgeryToken() %>
            <%= Html.ValidationSummary(true, "登录不成功。请更正错误并重试。") %>
        <div>
            <fieldset>
                <legend>帐户信息</legend>            
                <div class="editor-label">
                    <%= Html.LabelFor(m => m.UserName) %>
                </div>
                <div class="editor-field">
                    <%= Html.TextBoxFor(m => m.UserName)%>
                    <%= Html.ValidationMessageFor(m => m.UserName)%>
                    <label id="UserNameTip"></label>
                </div>
                <div class="editor-label">
                    <%= Html.LabelFor(m => m.Password) %>
                </div>
                <div class="editor-field">
                    <%= Html.PasswordFor(m => m.Password) %>
                    <%= Html.ValidationMessageFor(m => m.Password) %>
                </div>
                <p>
                    <input type="submit" value="登录" />
                </p>
            </fieldset>
        </div>
        <% } %>    

    2.d在对应的Action中用[ValidateAntiForgeryToken]进行标识:如下

            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Login(Usr usr)
            {
                if (ModelState.IsValid)
                {
                    var model = DB.Context.Single<Usr>(p => p.SystemUser == true && p.UserName == usr.UserName && p.Password == usr.Password);
                    if (model != null)
                    {
                        authenticate.Login(usr.UserName, usr.Role);
                        return RedirectToAction("UserList", "Admin");
                    }
                    else
                    {
                        ModelState.AddModelError("", "提供的用户名或密码不正确。");
                    }
                }
                return View(usr);
            }

    其实我们发现Asp.net MVC 帮我们做了很多。

    原创文字只代表本人某一时间内的观点或结论,本人不对涉及到的任何代码担保。转载请标明出处!

  • 相关阅读:
    结构体数组
    怎样在Linux下通过ldapsearch查询活动文件夹的内容
    Phalcon之 表单(Forms)
    Java模式(适配器模式)
    人类智商一般在多少左右?爱因斯坦的智商是多少?
    SQL中declare申明变量
    apache2.2 虚拟主机配置
    项目实施阶段该做好哪些方面的工作
    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之全然具体解释
    ExtJs自学教程(1):一切从API開始
  • 原文地址:https://www.cnblogs.com/leleroyn/p/1921544.html
Copyright © 2011-2022 走看看