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