zoukankan      html  css  js  c++  java
  • ASP.NET MVC 防止CSRF攻击

    在前台表单中使用@Html.AntiForgeryToken(),在后台action上添加ValidateAntiForgeryToken特性

    表单提交,防止CSRF攻击。

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        <p>
            <label>
                Username:</label><input name="username" /></p>
        <p>
            <label>
                Password:</label><input name="password" type="password" /></p>
        <input type="submit" value="登录" />
    }
            [ValidateAntiForgeryToken]
            public ActionResult DoSth(string username, string password)
            {
                return Content("ASP.NET MVC中,表单提交防止CSRF。");
            }

    使用AJAX提交。防止CSRF攻击

    前台代码

    @using (Html.BeginForm("Login", "Home"))
    {
        <p>
            <label>
                Username:</label><input name="username" /></p>
        <p>
            <label>
                Password:</label><input name="password" type="password" /></p>
        <input type="submit" value="登录" />
        <input type="button" id="btn1" value="异步登录" />
    }
    <script src="../../JS/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn1").click(function () {
                $.ajax({
                    type: "Post",
                    url: '@Url.Action("Login", "Home")',
                    data: { "username": "vichin", "password": "123" }, //post请求,不需要key
                    success: function (res) {
                        alert(res);
                    },
                    error: function (msg) {
                        alert(msg.responseText);
                    }, headers: {
                        token: $('@Html.AntiForgeryToken()').val()
                        //如果表单中没有使用Html.AntiForgeryToken(),那么就用上面这种方式来获取token。
                        //如果页面上使用了,那么页面上就会生成name为__RequestVerificationToken的隐藏域。
                        //可以使用$('[name=__RequestVerificationToken]').val()来获取。
                    }
                });
            });
        })
    </script>

    在后台代码中,需要增加过滤器。然后在请求的action上应用该过滤器。

        public class MyAntiForgeryTokenAttribute : AuthorizeAttribute
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                var request = filterContext.HttpContext.Request;
                if (request.HttpMethod == WebRequestMethods.Http.Post)
                {
                    if (request.IsAjaxRequest())
                    {
                        var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
                        var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
                        //从cookies 和 Headers 中 验证防伪标记
                        AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);//这里可以加try-catch
                    }
                    else
                    {
                        new ValidateAntiForgeryTokenAttribute().OnAuthorization(filterContext);
                    }
                }
            }
        }
            [MyAntiForgeryToken]
            public ActionResult Login(string username, string password)
            {
                return Content("ASP.NET MVC中,表单提交防止CSRF。");
            }

  • 相关阅读:
    内容页超连接关键词的完美实现
    鼠标经过文字链接时出现漂亮的提示层
    简单的jQuery检测注册用户名
    触发Repeater中的Dropdownlist的SelectedIndexChanged如何获得Repeater的当前行
    读取XML的节点属性并绑定到ListBox
    第十八章 6string型字符串的替换 简单
    第十八章 2string字符串 简单
    第十七章 特殊成员_函数指针也可以做为参数 简单
    第十七章 特殊成员_类的函数指针 简单
    第十七章 特殊成员_成员函数指针数组 简单
  • 原文地址:https://www.cnblogs.com/vichin/p/12273321.html
Copyright © 2011-2022 走看看