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>
  • 相关阅读:
    pycharm使用小技巧
    多线程的异常处理
    零星
    python的多线程 ThreadPoolExecutor
    零星
    python的轮询timer 和js的轮询setInterval
    fcitx 输入框纵向
    Gvim配置
    窗口,父窗口parentwindow,所有者窗口ownerwindow
    Request对象 --web浏览器向web服务端的请求
  • 原文地址:https://www.cnblogs.com/haosit/p/10899296.html
Copyright © 2011-2022 走看看