手机版

如何在ASP.NET核心使用Csp报头抵抗Xss攻击

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

内容安全策略(CSP)是一个附加的安全层,可以帮助检测和减轻某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击。这些攻击被用于从数据窃取到站点破坏或恶意软件分发(深入到CSP)的所有事情

简而言之,CSP是网页控制允许加载哪些资源的一种方式。例如,页面可以显式声明允许从中加载JavaScript、CSS和图像的资源。这有助于防止跨站点脚本(XSS)攻击和其他问题。

它还可以用来限制协议,例如限制通过HTTPS加载的内容。CSP是通过内容安全策略HTTP响应中的标头实现的。

要启用CSP,您需要配置Web服务器以返回内容-安全-策略HTTP头。在本文中,我们将尝试向ASP.NET核心应用程序添加CSP。

app。使用(async (ctx,next)={ ctx。响应。标题。添加('内容-安全-策略','默认-src '自身';report-uri/cspreport ');等待下一个();});将cdn文件引入Home/Index,然后我们开始项目,看看会发生什么!

运行并观察错误。加载页面时,浏览器拒绝从远程源加载。

因此,我们可以组织CSP来控制我们的白名单。在配置中,我们需要填写来源和内容。以下是常用的限制。

来源:

*:允许任何网站。self':允许提供页面的来源。请注意,单引号是必需的。none':不允许任何来源。请注意,单引号是必需的。主机:允许指定的互联网主机(按名称或IP地址)。通配符(星号字符)可用于包括所有子域,例如,http://* . foo.com“unsafe-line”:允许内嵌脚本“nonce-[base64-value]”:允许内嵌脚本带有特定的nonce(使用数字一次)。对于每个HTTP请求/响应,随机数应该是加密的和唯一的。

说明:

Script-src:定义一个有效的JavaScript源样式-src:定义一个有效的样式表源img-src:定义一个有效的图像源connect-src:定义一个可以进行AJAX调用的有效源font-src:定义一个有效的字体源对象-src:定义一个对象。嵌入和小程序元素的有效来源媒体-src:定义有效的音频和视频源表单-动作:定义可用作HTML表单操作的有效来源。Default-src:指定加载内容的默认策略

我们可以在可重用的中间件中封装、构建和添加CSP头。下面是一个让你开始的例子。您可以根据需要进行扩展。首先,创建一个类来保存源代码。

公共类CspOptions { public Liststring Defaults { get;设置;}=new Liststring();公共列表字符串脚本{ get设置;}=new Liststring();公共列表字符串样式{ get设置;}=new Liststring();公共列表字符串图像{ get设置;}=new Liststring();公共列表字符串字体{ get设置;}=new Liststring();public Liststring Media { get设置;}=new Liststring();}开发中间件必须需要一个构造函数,该构造函数将用于注入。net核心到运行环境中。

公共密封类cspoptionbuilder { private readonly CspOptions options=new CspOptions();内部cspoptionbuilder(){ }公共cspdireactivebuilder默认值{获取设置;}=new cspdireactivebuilder();公共cspdireactivebuilder脚本{获取设置;}=new cspdireactivebuilder();公共cspdireactivebuilder样式{获取设置;}=new cspdireactivebuilder();公共cspdireactivebuilder Images { get;设置;}=new cspdireactivebuilder();公共cspdireactivebuilder字体{获取设置;}=new cspdireactivebuilder();公共CspDirectiveBuilder媒体{ get设置;}=new cspdireactivebuilder();内部CspOptions Build(){ this。选项。默认值=这个.默认值。来源;这个。选项。脚本=这个。脚本。来源;这个.选项.样式=这个.风格。来源;这个。选项。图像=这个。图像。来源;this . options . font=this .字体。来源;这个。选项。媒体=这个。媒体。来源;返回this.options} }公共密封类CspDirectiveBuilder {内部cspdireactivebuilder(){ }内部列表字符串源{获取设置;}=new Liststring();public cspdireactivebuilder AllowSelf()=Allow(“‘self’”);public cspdireactivebuilder allowone()=Allow(' none ');public cspdireactivebuilder allowy()=Allow(' * ');公共cspdireactivebuilder允许(字符串源){这个.来源。添加(来源);归还这个;} }好了,我们创建一个中间件。

命名空间XSSDefenses .XSSDefenses。MiddlerWare { public sealed class CspOptionMiddlerWare { private const string HEADER=' Content-Security-Policy ';私有只读下一个请求委托私有只读CspOptions选项;public CspOptionMiddlerWare(请求委托next,CspOptions options){ this。next=nextthis.options=options}公共异步任务调用(HttpContext上下文){上下文.回应。Headers.Add(HEADER,GetHeaderValue());等待这个。下一个(上下文);}私有字符串GetHeaderValue(){ var值=' ';value=GetDirective(' default-src ',这。选项。默认值);value=GetDirective('script-src ',这。选项。脚本);value=GetDirective('style-src ',这个。选项。风格);value=GetDirective('img-src ',这个。选项。图像);value=GetDirective('font-src ',这个。选项。字体);value=GetDirective('media-src ',这。选项。媒体);返回值;}私有字符串GetDirective(字符串指令,列表字符串来源)=来源.数到0?$ ' {指令} {字符串。联接("",sources)};": '';}}以及设置它的扩展方法。

命名空间XSSDefenses .XSSDefenses。扩展{公共静态类cspmiddlewareeextensions {公共静态IApplicationBuilder UseCsp(此IApplicationBuilder应用程序,actioncspoptionbuilder){ var new builder=new cspoptionbuilder();建设者(新建筑商);var options=newBuilder .build();返回应用程序usemiddlewarecoptionmiddlerware(选项);} }}我们现在可以在启动类中配置中间件。

应用程序.UseCsp(builder={ builder .样式AllowSelf().允许(@ ' https://Ajax。aspnetcdn。com/');});启动发现,观察网络资源。浏览器已经允许本地和远程资源。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

版权声明:如何在ASP.NET核心使用Csp报头抵抗Xss攻击是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。