• ASP.NET Core中防跨站点请求伪造


    CSRF(Cross-site request forgery)利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

    例子

    在某个论坛管理页面,管理员可以在list页面执行删除帖子操作,根据URL判断删除帖子的id,像这样的一个URL

    http://localhost/list?action=delete&id=12
    

    当恶意用户向管理员发送包含CSRF的邮件,骗取管理员访问http://test.com/csrf,在这个恶意网页中只要包含这样的html语句就可以利用让管理员在不知情的情况下删除帖子了

    <img alt="" arc="http://localhost/list?action=delete&id=12"/>
    

    这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。

    透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作

    解决方案

    • 检查Referer字段
    • 添加校验token。使用攻击者无法伪造的数据作为校验

    ASP.NET Core中提供了防伪造令牌,这样的令牌需要从用户应该使用的表单中创建,以输入有效数据,并在接受数据时进行验证。

    <form asp-controller="Home" asp-action="Edit" method="post">
        @Html.AntiForgeryToken()
        <input type="text" />
        <input type="text" />
        <input type="submit" value="Submit" />
    </form>
    

    运行应用程序时,可以看到一个隐藏的表单字段,其中包含自动生成的令牌。当检索这个数据时,使用ValidateAntiForgeryToken属性对标记进行验证。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Edit(EditModel model) => View("EditResult", model);
    
  • 相关阅读:
    luogu3810 【模板】三维偏序(陌上花开)
    POJ 1704 Georgia and Bob(阶梯博弈)
    URAL 1004 Sightseeing Trip(floyd求最小环+路径输出)
    BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
    Codeforces Round #332 (Div. 2) D. Spongebob and Squares(枚举)
    HDU 4313 Matrix(并查集)
    HDU 4312 Meeting point-2(切比雪夫距离转曼哈顿距离)
    HDU 4311 Meeting point-1(曼哈顿距离最小)
    HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)
    HDU 4303 Hourai Jeweled(树形DP)
  • 原文地址:https://www.cnblogs.com/rohmeng/p/11154860.html
Copyright © 2020-2023  润新知