欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-05 10:15:18
CSRF(Cross site request forgery)利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。 例子 在某个论坛管理页面,管理员可以在list页面执行删除帖子操作,根据URL判断删除帖子的id,像这样的一个U ......

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);