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

嚴華  论坛元老 | 2024-11-1 01:29:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

网站的安全对于任何一家公司都是非常重要的。
为了包管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、默认安全头
  1. app.UseSecurityHeaders();
复制代码
2、自定义安全头
  1. // 创建一个新的HeaderPolicyCollection实例,用于配置安全头部  
  2. var policyCollection = new HeaderPolicyCollection()  
  3.     // 添加X-Frame-Options头部,设置为DENY,防止网站被嵌入到iframe中  
  4.     .AddFrameOptionsDeny()  
  5.     // 添加X-XSS-Protection头部,设置为BLOCK,尝试阻止跨站脚本攻击  
  6.     .AddXssProtectionBlock()  
  7.     // 添加X-Content-Type-Options头部,设置为nosniff,防止浏览器尝试基于内容“嗅探”响应的内容类型  
  8.     .AddContentTypeOptionsNoSniff()  
  9.     // 添加Strict-Transport-Security头部,设置max-age为一年(秒为单位),并包含所有子域  
  10.     // 这要求浏览器仅通过HTTPS与服务器通信  
  11.     .AddStrictTransportSecurityMaxAgeIncludeSubDomains(maxAgeInSeconds: 60 * 60 * 24 * 365) // maxage = one year in seconds  
  12.     // 添加Referrer-Policy头部,设置为strict-origin-when-cross-origin  
  13.     // 这控制了在跨源请求中是否发送Referer头部,以及发送多少信息  
  14.     .AddReferrerPolicyStrictOriginWhenCrossOrigin()  
  15.     // 移除Server头部,以减少信息泄露  
  16.     .RemoveServerHeader()  
  17.     // 添加Content-Security-Policy头部,配置详细的资源加载策略  
  18.     .AddContentSecurityPolicy(builder =>  
  19.     {  
  20.         // 禁止从任何源加载对象(如插件)  
  21.         builder.AddObjectSrc().None();  
  22.         // 仅允许表单操作(如提交)到同一源  
  23.         builder.AddFormAction().Self();  
  24.         // 禁止将当前页面作为frame的祖先  
  25.         builder.AddFrameAncestors().None();  
  26.     })  
  27.     // 添加Cross-Origin-Opener-Policy头部,设置为same-origin  
  28.     // 这控制了哪些文档可以通过window.open(), window.createPopup(), 或类似的方法打开  
  29.     .AddCrossOriginOpenerPolicy(builder =>  
  30.     {  
  31.         builder.SameOrigin();  
  32.     })  
  33.     // 添加Cross-Origin-Embedder-Policy头部,设置为require-corp  
  34.     // 这要求嵌入的文档通过COEP报头声明它们是COOP兼容的  
  35.     .AddCrossOriginEmbedderPolicy(builder =>  
  36.     {  
  37.         builder.RequireCorp();  
  38.     })  
  39.     // 添加Cross-Origin-Resource-Policy头部,设置为same-origin  
  40.     // 这控制了哪些源可以加载资源(如图片、脚本等)  
  41.     .AddCrossOriginResourcePolicy(builder =>  
  42.     {  
  43.         builder.SameOrigin();  
  44.     })  
  45.     // 添加自定义的HTTP头部  
  46.     .AddCustomHeader("X-My-Test-Header", "Header value");  
  47. // 使用配置好的安全头部策略  
  48. app.UseSecurityHeaders(policyCollection);
复制代码
3、移除服务器相应标头
  1. var host = new WebHostBuilder()
  2.     .UseKestrel(options => options.AddServerHeader = false)
复制代码
4、内容安全计谋
  1. // 创建一个HeaderPolicyCollection实例,用于定义和管理HTTP响应的安全头  
  2. var policyCollection = new HeaderPolicyCollection()  
  3.     .AddContentSecurityPolicy(builder =>  
  4.     {  
  5.         // 添加策略以自动将不安全的请求(如HTTP)升级到HTTPS  
  6.         builder.AddUpgradeInsecureRequests(); // upgrade-insecure-requests  
  7.         // 阻止所有混合内容(HTTPS页面中的HTTP资源)  
  8.         builder.AddBlockAllMixedContent(); // block-all-mixed-content  
  9.         // 指定用于接收CSP违规报告的URI  
  10.         builder.AddReportUri() // report-uri: https://report-uri.com  
  11.             .To("https://report-uri.com");  
  12.         // 定义默认的源策略,仅允许加载当前来源和http://testUrl.com的资源  
  13.         builder.AddDefaultSrc() // default-src 'self' http://testUrl.com  
  14.             .Self() // 仅允许加载来自相同源的资源  
  15.             .From("http://testUrl.com"); // 允许加载来自http://testUrl.com的资源  
  16.         // 定义允许连接的源  
  17.         builder.AddConnectSrc() // connect-src 'self' http://testUrl.com  
  18.             .Self() // 允许与当前源建立连接  
  19.             .From("http://testUrl.com"); // 允许与http://testUrl.com建立连接  
  20.         // 定义允许加载的字体源  
  21.         builder.AddFontSrc() // font-src 'self'  
  22.             .Self(); // 仅允许加载来自相同源的字体  
  23.         // 禁止通过<object>、<embed>或<applet>标签加载资源  
  24.         builder.AddObjectSrc() // object-src 'none'  
  25.             .None(); // 禁用<object>、<embed>或<applet>  
  26.         // 定义表单动作源,即限制哪些源可以处理表单提交  
  27.         builder.AddFormAction() // form-action 'self'  
  28.             .Self(); // 仅允许表单提交到当前源  
  29.         // 定义图片资源只能来自HTTPS源  
  30.         builder.AddImgSrc() // img-src https:  
  31.             .OverHttps(); // 仅允许HTTPS协议的图片资源  
  32.         // 定义脚本资源策略,允许加载来自相同源的脚本,允许内联脚本和eval,并报告样本  
  33.         builder.AddScriptSrc() // script-src 'self' 'unsafe-inline' 'unsafe-eval' 'report-sample'  
  34.             .Self() // 允许加载来自相同源的脚本  
  35.             .UnsafeInline() // 允许内联脚本  
  36.             .UnsafeEval() // 允许使用eval()等函数  
  37.             .ReportSample(); // 报告脚本样本以供审查  
  38.         // 定义样式资源策略,允许加载来自相同源的样式,并启用严格动态检查  
  39.         builder.AddStyleSrc() // style-src 'self' 'strict-dynamic'  
  40.             .Self() // 允许加载来自相同源的样式  
  41.             .StrictDynamic(); // 启用严格动态检查  
  42.         // 定义媒体资源只能来自HTTPS源  
  43.         builder.AddMediaSrc() // media-src https:  
  44.             .OverHttps(); // 仅允许HTTPS协议的媒体资源  
  45.         // 定义可以嵌入当前页面的框架的源,此处禁用所有框架嵌入  
  46.         builder.AddFrameAncestors() // frame-ancestors 'none'  
  47.             .None(); // 禁止任何源嵌入当前页面  
  48.         // 定义基准URI,限制页面内基础URI(如<base>标签)的来源  
  49.         builder.AddBaseUri() // base-uri 'self'  
  50.             .Self(); // 仅允许基础URI与当前源相同  
  51.         // 定义可以嵌入<frame>、<iframe>、<object>、<embed>或<applet>的源  
  52.         builder.AddFrameSource() // frame-src http://testUrl.com  
  53.             .From("http://testUrl.com"); // 允许嵌入来自http://testUrl.com的框架  
  54.         // 添加自定义指令,例如限制允许的插件类型  
  55.         builder.AddCustomDirective("plugin-types", "application/x-shockwave-flash"); // 限制只允许Flash插件  
  56.     })  
  57.     // 添加自定义HTTP头  
  58.     .AddCustomHeader("X-My-Test-Header", "Header value");  
  59. // 使用定义好的安全头策略  
  60. app.UseSecurityHeaders(policyCollection);
复制代码
5、权限计谋
  1. // 创建一个HeaderPolicyCollection实例,用于存储和配置各种安全策略  
  2. var policyCollection = new HeaderPolicyCollection()  
  3.     // 添加Permissions Policy(功能策略),用于控制网页可以使用哪些Web功能  
  4.     .AddPermissionsPolicy(builder =>  
  5.     {  
  6.         // 允许页面从自身源('self')或指定的URL(http://testUrl.com)访问加速度计  
  7.         builder.AddAccelerometer()  
  8.             .Self()  
  9.             .For("http://testUrl.com");  
  10.         // 允许页面从自身源访问环境光传感器  
  11.         builder.AddAmbientLightSensor()  
  12.             .Self()  
  13.             .For("http://testUrl.com");  
  14.         // 允许页面自动播放媒体内容,仅从自身源  
  15.         builder.AddAutoplay()  
  16.             .Self();  
  17.         // 禁止页面访问摄像头  
  18.         builder.AddCamera()  
  19.             .None();  
  20.         // 允许页面从自身源加载加密媒体  
  21.         builder.AddEncryptedMedia()  
  22.             .Self();  
  23.         // 允许页面全屏模式,对所有源  
  24.         builder.AddFullscreen()  
  25.             .All();  
  26.         // 禁止页面访问地理位置  
  27.         builder.AddGeolocation()  
  28.             .None();  
  29.         // 禁止页面访问陀螺仪  
  30.         builder.AddGyroscope()  
  31.             .None();  
  32.         // 禁止页面访问磁力计  
  33.         builder.AddMagnetometer()  
  34.             .None();  
  35.         // 禁止页面访问麦克风  
  36.         builder.AddMicrophone()  
  37.             .None();  
  38.         // 禁止页面访问MIDI设备  
  39.         builder.AddMidi()  
  40.             .None();  
  41.         // 禁止页面执行支付请求  
  42.         builder.AddPayment()  
  43.             .None();  
  44.         // 禁止页面使用画中画模式  
  45.         builder.AddPictureInPicture()  
  46.             .None();  
  47.         // 禁止页面访问扬声器  
  48.         builder.AddSpeaker()  
  49.             .None();  
  50.         // 禁止页面执行同步XHR请求  
  51.         builder.AddSyncXHR()  
  52.             .None();  
  53.         // 禁止页面访问USB设备  
  54.         builder.AddUsb()  
  55.             .None();  
  56.         // 禁止页面访问VR设备  
  57.         builder.AddVR()  
  58.             .None();  
  59.         // 添加自定义功能策略,例如限制Flash插件的使用  
  60.         builder.AddCustomFeature("plugin-types", "application/x-shockwave-flash");  
  61.         // 添加自定义的iframe策略,允许从自身源或指定URL加载iframe  
  62.         builder.AddCustomFeature("iframe")  
  63.             .Self()  
  64.             .For("http://testUrl.com");  
  65.     });  
  66. // 应用前面定义的安全策略头部到应用程序响应中  
  67. 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个扩展方法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表