• .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>
  • 相关阅读:
    Struts的ONGL
    深度解析 Qt 中动态链接库
    QTcpSocket 发送数据的几种方法
    QT GUI总结
    Qt 插件学习(一)
    Qt自定义窗口部件
    Qt事件机制浅析
    VS2008 Qt Designer 中自定义信号槽
    Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
    QT中窗口刷新事件的学习总结
  • 原文地址:https://www.cnblogs.com/haosit/p/10899296.html
Copyright © 2020-2023  润新知