SecurityHeaders:为.Net网站添加安全标头,让Web更加安全、避免攻击!

news/2024/11/9 14:30:56/

网站的安全对于任何一家公司都是非常重要的。

为了保证Web安全,其中Http安全标头就是非常重要一个的措施。设定正确的安全头可以增强网站的安全性,因为它们可以帮助防止各种网络攻击,如跨站脚本(XSS)、点击劫持(Clickjacking)和内容类型嗅探(Content Type Sniffing)等。

下面推荐一个开源项目,可以让我们轻松地添加安全相关的HTTP头到网站中。

01 项目简介

NetEscapades.AspNetCore.SecurityHeaders 是一个轻便的的 ASP.NET Core 开源库,旨在方便开发者向 ASP.NET Core 网站添加安全头(Security Headers)。

该库提供了一套默认的安全头,都是非常常见的,这些头被广泛应用于提高网站的安全性。

02 核心功能与特点

1、提供默认安全

X-Content-Type-Options: nosniff:防止浏览器尝试“嗅探”响应的内容类型。

Strict-Transport-Security:max-age=31536000; includeSubDomains(仅HTTPS响应):强制浏览器通过HTTPS与服务器建立连接。

X-Frame-Options: Deny(仅“document”响应):防止网站被嵌入到iframe中。

X-XSS-Protection: 1; mode=block(仅“document”响应):启用浏览器的XSS过滤器。

Referrer-Policy: strict-origin-when-cross-origin:控制HTTP请求的Referer头部。

Content-Security-Policy(CSP):定义哪些动态资源是允许的,帮助防止XSS攻击等。

**2、自定义安全头:**开发者可以根据需要自定义安全头。

**3、内容安全策略(CSP):**精细控制哪些外部资源(如脚本、样式表、图片等)可以被加载到网页上。

**4、权限策略(Permissions Policy):**控制的是浏览器特性和API的使用,而不是资源加载。通过Permissions Policy,开发者可以确保敏感API(如地理位置、摄像头等)不会被滥用。

**5、Nonce和哈希:**对于需要内联脚本或样式的情况,CSP支持使用Nonce(一次性数字)或哈希值来允许这些内联内容。

**6、灵活性:**可以根据需要启用或禁用特定的安全头,或者调整它们的配置,以满足不同的安全需求。

**7、集成简单:**该库通过中间件的形式集成到ASP.NET Core应用中,只需一行代码就可以轻松集成。

03 使用方法

1、默认安全

 app.UseSecurityHeaders();

2、自定义安全

// 创建一个新的HeaderPolicyCollection实例,用于配置安全头部  
var policyCollection = new HeaderPolicyCollection()  // 添加X-Frame-Options头部,设置为DENY,防止网站被嵌入到iframe中  .AddFrameOptionsDeny()  // 添加X-XSS-Protection头部,设置为BLOCK,尝试阻止跨站脚本攻击  .AddXssProtectionBlock()  // 添加X-Content-Type-Options头部,设置为nosniff,防止浏览器尝试基于内容“嗅探”响应的内容类型  .AddContentTypeOptionsNoSniff()  // 添加Strict-Transport-Security头部,设置max-age为一年(秒为单位),并包含所有子域  // 这要求浏览器仅通过HTTPS与服务器通信  .AddStrictTransportSecurityMaxAgeIncludeSubDomains(maxAgeInSeconds: 60 * 60 * 24 * 365) // maxage = one year in seconds  // 添加Referrer-Policy头部,设置为strict-origin-when-cross-origin  // 这控制了在跨源请求中是否发送Referer头部,以及发送多少信息  .AddReferrerPolicyStrictOriginWhenCrossOrigin()  // 移除Server头部,以减少信息泄露  .RemoveServerHeader()  // 添加Content-Security-Policy头部,配置详细的资源加载策略  .AddContentSecurityPolicy(builder =>  {  // 禁止从任何源加载对象(如插件)  builder.AddObjectSrc().None();  // 仅允许表单操作(如提交)到同一源  builder.AddFormAction().Self();  // 禁止将当前页面作为frame的祖先  builder.AddFrameAncestors().None();  })  // 添加Cross-Origin-Opener-Policy头部,设置为same-origin  // 这控制了哪些文档可以通过window.open(), window.createPopup(), 或类似的方法打开  .AddCrossOriginOpenerPolicy(builder =>  {  builder.SameOrigin();  })  // 添加Cross-Origin-Embedder-Policy头部,设置为require-corp  // 这要求嵌入的文档通过COEP报头声明它们是COOP兼容的  .AddCrossOriginEmbedderPolicy(builder =>  {  builder.RequireCorp();  })  // 添加Cross-Origin-Resource-Policy头部,设置为same-origin  // 这控制了哪些源可以加载资源(如图片、脚本等)  .AddCrossOriginResourcePolicy(builder =>  {  builder.SameOrigin();  })  // 添加自定义的HTTP头部  .AddCustomHeader("X-My-Test-Header", "Header value");  // 使用配置好的安全头部策略  
app.UseSecurityHeaders(policyCollection);

3、移除服务器响应标头

var host = new WebHostBuilder().UseKestrel(options => options.AddServerHeader = false)

4、内容安全策略

// 创建一个HeaderPolicyCollection实例,用于定义和管理HTTP响应的安全头  
var policyCollection = new HeaderPolicyCollection()  .AddContentSecurityPolicy(builder =>  {  // 添加策略以自动将不安全的请求(如HTTP)升级到HTTPS  builder.AddUpgradeInsecureRequests(); // upgrade-insecure-requests  // 阻止所有混合内容(HTTPS页面中的HTTP资源)  builder.AddBlockAllMixedContent(); // block-all-mixed-content  // 指定用于接收CSP违规报告的URI  builder.AddReportUri() // report-uri: https://report-uri.com  .To("https://report-uri.com");  // 定义默认的源策略,仅允许加载当前来源和http://testUrl.com的资源  builder.AddDefaultSrc() // default-src 'self' http://testUrl.com  .Self() // 仅允许加载来自相同源的资源  .From("http://testUrl.com"); // 允许加载来自http://testUrl.com的资源  // 定义允许连接的源  builder.AddConnectSrc() // connect-src 'self' http://testUrl.com  .Self() // 允许与当前源建立连接  .From("http://testUrl.com"); // 允许与http://testUrl.com建立连接  // 定义允许加载的字体源  builder.AddFontSrc() // font-src 'self'  .Self(); // 仅允许加载来自相同源的字体  // 禁止通过<object>、<embed>或<applet>标签加载资源  builder.AddObjectSrc() // object-src 'none'  .None(); // 禁用<object>、<embed>或<applet>  // 定义表单动作源,即限制哪些源可以处理表单提交  builder.AddFormAction() // form-action 'self'  .Self(); // 仅允许表单提交到当前源  // 定义图片资源只能来自HTTPS源  builder.AddImgSrc() // img-src https:  .OverHttps(); // 仅允许HTTPS协议的图片资源  // 定义脚本资源策略,允许加载来自相同源的脚本,允许内联脚本和eval,并报告样本  builder.AddScriptSrc() // script-src 'self' 'unsafe-inline' 'unsafe-eval' 'report-sample'  .Self() // 允许加载来自相同源的脚本  .UnsafeInline() // 允许内联脚本  .UnsafeEval() // 允许使用eval()等函数  .ReportSample(); // 报告脚本样本以供审查  // 定义样式资源策略,允许加载来自相同源的样式,并启用严格动态检查  builder.AddStyleSrc() // style-src 'self' 'strict-dynamic'  .Self() // 允许加载来自相同源的样式  .StrictDynamic(); // 启用严格动态检查  // 定义媒体资源只能来自HTTPS源  builder.AddMediaSrc() // media-src https:  .OverHttps(); // 仅允许HTTPS协议的媒体资源  // 定义可以嵌入当前页面的框架的源,此处禁用所有框架嵌入  builder.AddFrameAncestors() // frame-ancestors 'none'  .None(); // 禁止任何源嵌入当前页面  // 定义基准URI,限制页面内基础URI(如<base>标签)的来源  builder.AddBaseUri() // base-uri 'self'  .Self(); // 仅允许基础URI与当前源相同  // 定义可以嵌入<frame>、<iframe>、<object>、<embed>或<applet>的源  builder.AddFrameSource() // frame-src http://testUrl.com  .From("http://testUrl.com"); // 允许嵌入来自http://testUrl.com的框架  // 添加自定义指令,例如限制允许的插件类型  builder.AddCustomDirective("plugin-types", "application/x-shockwave-flash"); // 限制只允许Flash插件  })  // 添加自定义HTTP头  .AddCustomHeader("X-My-Test-Header", "Header value");  // 使用定义好的安全头策略  
app.UseSecurityHeaders(policyCollection);

5、权限策略

// 创建一个HeaderPolicyCollection实例,用于存储和配置各种安全策略  
var policyCollection = new HeaderPolicyCollection()  // 添加Permissions Policy(功能策略),用于控制网页可以使用哪些Web功能  .AddPermissionsPolicy(builder =>  {  // 允许页面从自身源('self')或指定的URL(http://testUrl.com)访问加速度计  builder.AddAccelerometer()  .Self()  .For("http://testUrl.com");  // 允许页面从自身源访问环境光传感器  builder.AddAmbientLightSensor()  .Self()  .For("http://testUrl.com");  // 允许页面自动播放媒体内容,仅从自身源  builder.AddAutoplay()  .Self();  // 禁止页面访问摄像头  builder.AddCamera()  .None();  // 允许页面从自身源加载加密媒体  builder.AddEncryptedMedia()  .Self();  // 允许页面全屏模式,对所有源  builder.AddFullscreen()  .All();  // 禁止页面访问地理位置  builder.AddGeolocation()  .None();  // 禁止页面访问陀螺仪  builder.AddGyroscope()  .None();  // 禁止页面访问磁力计  builder.AddMagnetometer()  .None();  // 禁止页面访问麦克风  builder.AddMicrophone()  .None();  // 禁止页面访问MIDI设备  builder.AddMidi()  .None();  // 禁止页面执行支付请求  builder.AddPayment()  .None();  // 禁止页面使用画中画模式  builder.AddPictureInPicture()  .None();  // 禁止页面访问扬声器  builder.AddSpeaker()  .None();  // 禁止页面执行同步XHR请求  builder.AddSyncXHR()  .None();  // 禁止页面访问USB设备  builder.AddUsb()  .None();  // 禁止页面访问VR设备  builder.AddVR()  .None();  // 添加自定义功能策略,例如限制Flash插件的使用  builder.AddCustomFeature("plugin-types", "application/x-shockwave-flash");  // 添加自定义的iframe策略,允许从自身源或指定URL加载iframe  builder.AddCustomFeature("iframe")  .Self()  .For("http://testUrl.com");  });  // 应用前面定义的安全策略头部到应用程序响应中  
app.UseSecurityHeaders(policyCollection);  

04 项目地址

https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders

- End -

推荐阅读

Asp.net动态Web API的教程!

Kiota:基于OpenAPI的HTTP客户端代码生成器

盘点下5个Winform UI开源控件库

Scriban:高效、强大的.NET开源模板引擎,可用于邮件、文档生成!

一个C#开源工具库,集成了超过1000个扩展方法


http://www.ppmy.cn/news/1519495.html

相关文章

算法-汇总区间(228)

这题可以用区间来做&#xff0c;区间是什么&#xff0c;在编程问题中&#xff0c;区间常用于表示连续的数字集合&#xff0c;比如这道题【0&#xff0c;2】就表示0&#xff0c;1&#xff0c;2这样的数字集合。 所以这道题首先定义一个字符数组用来存输出结果&#xff0c;然后定…

Datawhale X 李宏毅苹果书 AI夏令营|机器学习基础之线性模型

1. 线性模型 线性模型是机器学习中最基础和常见的模型之一。在线性模型中&#xff0c;预测变量&#xff08;输入特征&#xff09;和目标变量&#xff08;输出&#xff09;之间的关系被建模为一个线性组合。数学形式可以表示为&#xff1a; 其中&#xff1a;x 是输入特征向量&a…

Linux平台中标麒麟安装单机DM8数据库

1 说明 数据库是现代信息化系统的基石&#xff0c;而国产数据库的发展则关乎国家的信息安全和国民经济的命脉。达梦数据库作为中国数据库领域的领军企业&#xff0c;其DM8数据库管理系统凭借其高性能、高可靠性、易用性等特点&#xff0c;逐渐赢得了用户的青睐。 本文详细介绍…

【开源免费】基于SpringBoot+Vue.JS渔具租赁系统(JAVA毕业设计)

本文项目编号 T 005 &#xff0c;文末自助获取源码 \color{red}{T005&#xff0c;文末自助获取源码} T005&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 渔…

牛牛替换(c语言)

1.//描述 //牛牛有一个长度为 n 的字符数组&#xff0c;他尝试把字符数组中其中一些字符替换成另一些字符。 //输入描述&#xff1a; //第一行输入一个正整数 n 表示字符数组的长度&#xff0c;四个个字符分别 a1 和 a2 &#xff0c; a3 和 a4&#xff0c; // 表示把字符数组中…

数据结构代码集训day8(适合考研、自学、期末和专升本)

习题来自B站up&#xff1a;白话拆解数据结构! 题目如下&#xff1a; &#xff08;1&#xff09;在递增有序的单链表L中&#xff0c;删除值重复的结点 &#xff08;2&#xff09;使带头节点单链表的值递增有序 题1 和之前顺序表那题差不多&#xff0c;因为是有序的&#xff0c…

生成图片的base64编码(纯C语言实现)

一、前言 Base64编码是一种广泛使用的编码方案&#xff0c;将任意二进制数据转换为可打印的ASCII字符字符串。这种编码方式之所以重要&#xff0c;是因为许多通信协议和存储介质对数据的可传输性和可存储性有特定的要求&#xff0c;它们可能无法直接处理或有效传输二进制数据。…

vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失

import Vue from vue; import VueRouter from vue-router;// 导入组件 import Home from ../views/Home.vue; import Parent from ../views/Parent.vue; import Child1 from ../views/Child1.vue; import Child2 from ../views/Child2.vue;Vue.use(VueRouter);// 定义路由 cons…