zoukankan      html  css  js  c++  java
  • .Net Core 防止跨站点请求伪造

    一、在From 表单中生成 antiforgery 令牌  

      1. ASP.NET Core MVC 和 Razor 页模板中的窗体的所有生成 antiforgery 令牌,唯一且不可预测。服务器先发送到客户端的当前用户的标识相关联的令牌。客户端返回将令牌发送到服务器进行验证。如果服务器收到与经过身份验证的用户的标识不匹配的令牌,将拒绝请求。

    <body>
        <form action="/Antiforgery/Post" method="post">
    
            @Html.AntiForgeryToken()
    
            <input type="text" name="id" />
    
            <button type="submit">提交</button>
        </form>
    
        @{
            using (Html.BeginForm("Post", "Antiforgery", FormMethod.Post))
            {
                <input type="text" name="id" />
    
                <button type="submit">提交</button>
            }
    
        }
    </body>

      2. 用 [ValidateAntiForgeryToken] 属性修饰需要验证的放法。ValidateAntiForgeryToken 属性需要对操作方法请求修饰,包括 HTTP GET 请求令牌。

    public class AntiforgeryController:Controller
        {
    
            public IActionResult Index()
            {
                return View();
            }
    
            [ValidateAntiForgeryToken]
            public JsonResult Post(string id)
            {
                return Json("success");
            }
        }

      3. AutoValidateAntiforgeryToken 可以修饰控制器类,其作用于所有Post请求。

        [AutoValidateAntiforgeryToken]
        public class AntiforgeryController:Controller
        {
    
            public IActionResult Index()
            {
                return View();
            }
    
            [HttpPost]
            public JsonResult Post(string id)
            {
                return Json("success");
            }
    
            [HttpPost]
            public JsonResult PostTest()
            {
                return Json("");
            }
        }

    二、Ajax的方式使用 antiforgery 令牌  

      1. 在配置自定义防伪功能,指定HeaderName

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAntiforgery(op =>
        {
            op.FormFieldName = "AntiforgeryField";
            op.HeaderName = "VerificationToken";//手动高亮
        });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

      2. 在页面上生成antiforgery令牌

    @inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery
    @{
        Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <input type="hidden" id="token" value="@Antiforgery.GetAndStoreTokens(Context).RequestToken"/>
    </body>
    </html>

      3. 把令牌存放到headers中调用ajax 

    @inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <input type="hidden" id="token" value="@Antiforgery.GetAndStoreTokens(Context).RequestToken"/>
        
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script>
            $.ajax({
                url: "/Antiforgery/Index",
                type: "post",
                data: { id: "123" },
                headers: { VerificationToken: $("#token").val() },
                success: function (r) {
                    console.log(r);
                },
                error: function (e) {
                    console.log(e);
                }
            });
        </script>
    </body>
    </html>
  • 相关阅读:
    浅谈JS的数组遍历方法
    浅谈JavaScript函数重载
    随机数的组合问题(JavaScript描述)
    如何使用百度bae部署web项目
    阿里前端笔试总结
    有趣的JavaScript隐式类型转换
    CSS如何实现”右部宽度固定,左部自适应“的布局
    Nor Flash的理论性能
    python argparse:命令行参数解析详解
    rwcheck:为嵌入式设备设计的读写压测工具
  • 原文地址:https://www.cnblogs.com/haosit/p/10899296.html
Copyright © 2011-2022 走看看