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

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

为了保证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个扩展方法

相关推荐
jjyangyou32 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
我要洋人死1 小时前
导航栏及下拉菜单的实现
前端·css·css3
AltmanChan1 小时前
大语言模型安全威胁
人工智能·安全·语言模型
科技探秘人1 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人1 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR1 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
马船长1 小时前
红帆OA iorepsavexml.aspx文件上传漏洞
安全
q2498596931 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai1 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书