热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在ASP.NETWebAPI中防止跨站点请求伪造(CSRF)攻击

定义跨站点请求伪造(CSRF)是一种恶意站点向用户当前登录的易受攻击的站点发送请求的攻击方式。以下是CSRF攻击的示例(必须具备的条件&#
定义

跨站点请求伪造(CSRF)是一种恶意站点向用户当前登录的易受攻击的站点发送请求的攻击方式。

以下是CSRF攻击的示例(必须具备的条件):

  1. 用户使用表单验证登录 www.example.com。
  2. 服务器验证用户,响应(Response)包含了一个认证COOKIE。
  3. 用户没有注销,然后访问了恶意网站。此恶意网站包含以下HTML表单:

    1 <h1>You Are a Winner!h1>
    2 <form action&#61;"http://example.com/api/account" method&#61;"post">
    3 <input type&#61;"hidden" name&#61;"Transaction" value&#61;"withdraw" />
    4 <input type&#61;"hidden" name&#61;"Amount" value&#61;"1000000" />
    5 <input type&#61;"submit" value&#61;"Click Me"/>
    6 form>

     

    请注意&#xff0c;表单的Action是Post到易受攻击的网站&#xff0c;而不是恶意网站。这是CSRF的“跨站点”部分

  4. 用户点击提交按钮。浏览器请求包含身份验证COOKIE。
  5. 请求在具有用户身份验证上下文的服务器上运行&#xff0c;并且可以做任何经过身份验证的用户才能被允许做的操作。

虽然此示例需要用户主动单击表单按钮&#xff0c;但是恶意页面可以轻松运行自动提交表单的脚本。此外&#xff0c;使用SSL不能阻止CSRF攻击&#xff0c;因为恶意站点也可以发送“https&#xff1a;//”请求。

通常&#xff0c;针对使用COOKIE进行身份验证的网站可能会发生CSRF攻击&#xff0c;因为浏览器会将所有相关的COOKIE发送到目标网站。然而&#xff0c;CSRF攻击并不仅限于利用COOKIE。例如&#xff0c;BasicDigest身份验证也很脆弱。用户使用“Basic”或“Digest”身份验证登录后&#xff0c;浏览器会自动发送凭证直到会话结束。

 

防伪令牌(Anti-Forgery Tokens)

为了帮助防止CSRF攻击&#xff0c;ASP.NET MVC使用防伪令牌&#xff08;Anti-Forgery Tokens&#xff09;&#xff0c;也称为请求验证令牌

  1. 客户端请求包含表单的HTML页面。
  2. 服务器在响应中包含两个令牌。一个令牌作为一个COOKIE发送。另一个放置在隐藏的表单字段中。令牌随机生成&#xff0c;使攻击者无法猜测令牌值。
  3. 当客户端提交表单时&#xff0c;它必须将两个令牌发送回服务器。客户端将COOKIE令牌作为COOKIE发送&#xff0c;并在表单数据中发送表单令牌。&#xff08;浏览器客户端在用户提交表单时自动执行此操作。&#xff09;
  4. 如果请求不包含这两个令牌&#xff0c;则服务器不允许该请求。

以下是具有隐藏表单令牌的HTML表单的示例&#xff1a;

<form action&#61;"/Home/Test" method&#61;"post"><input name&#61;"__RequestVerificationToken" type&#61;"hidden" value&#61;"6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" /> <input type&#61;"submit" value&#61;"Submit" />
form>

防伪令牌的工作原理是恶意页面无法读取用户的令牌&#xff0c;因为有同源策略。&#xff08;同源策略可以防止两个不同站点上托管的文件访问对方的内容&#xff0c;所以在前面的例子中&#xff0c;恶意页面可以发送请求到example.com&#xff0c;但不能读取响应。&#xff09;

为了防止CSRF攻击&#xff0c;任何在用户登录后浏览器默认发送凭据的身份验证协议都应使用防伪令牌。包括基于COOKIE的身份验证协议&#xff0c;如表单身份验证以及BasicDigest&#xff08;摘要&#xff09;身份验证等协议。

您应该对任何非安全方法&#xff08;POST&#xff0c;PUT&#xff0c;DELETE&#xff09;要求防伪令牌。另外&#xff0c;确保安全的方法&#xff08;GET&#xff0c;HEAD&#xff09;没有任何副作用。此外&#xff0c;如果您启用跨域支持&#xff08;如CORS或JSONP&#xff09;&#xff0c;则甚至安全的方法&#xff08;如GET&#xff09;也可能容易受到CSRF攻击的攻击&#xff0c;从而允许攻击者读取潜在的敏感数据。

 

ASP.NET MVC中的防伪令牌

要将防伪令牌添加到Razor页面&#xff0c;请使用HtmlHelper.AntiForgeryToken帮助方法&#xff1a;

&#64;using (Html.BeginForm("Manage", "Account")) {&#64;Html.AntiForgeryToken()
}

此方法添加隐藏表单字段&#xff0c;并设置COOKIE令牌。

 

Anti-CSRF 和 AJAX

表单令牌可能是AJAX请求的一个问题&#xff0c;因为AJAX请求可能会发送JSON数据&#xff0c;而不是HTML表单数据。一个解决方案是将Token发送到自定义HTTP标头。以下代码使用Razor语法生成令牌&#xff0c;然后将令牌添加到AJAX请求。令牌通过调用AntiForgery.GetTokens在服务器端生成。

 

处理请求时&#xff0c;从请求头中提取令牌。然后调用AntiForgery.Validate方法来验证令牌。如果令牌无效&#xff0c;该验证方法将引发异常。

void ValidateRequestHeader(HttpRequestMessage request)
{
string COOKIEToken &#61; "";string formToken &#61; "";IEnumerable<string> tokenHeaders;if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders)){string[] tokens &#61; tokenHeaders.First().Split(&#39;:&#39;);if (tokens.Length &#61;&#61; 2){COOKIEToken &#61; tokens[0].Trim();formToken &#61; tokens[1].Trim();}}AntiForgery.Validate(COOKIEToken, formToken);
}

 

转:https://www.cnblogs.com/WinHEC/articles/Preventing_CSRF_Attacks_in_ASP_NET_Web_API.html



推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
林亚培_724
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有