网站的安全对于任何一家公司都是非常重要的。
为了保证Web安全,其中Http安全标头就是非常重要一个的措施。设定正确的安全头可以增强网站的安全性,因为它们可以帮助防止各种网络攻击,如跨站脚本(XSS)、点击劫持(Clickjacking)和内容类型嗅探(Content Type Sniffing)等。
下面推荐一个开源项目,可以让我们轻松地添加安全相关的HTTP头到网站中。
NetEscapades.AspNetCore.SecurityHeaders 是一个轻便的的 ASP.NET Core 开源库,旨在方便开发者向 ASP.NET Core 网站添加安全头(Security Headers)。
该库提供了一套默认的安全头,都是非常常见的,这些头被广泛应用于提高网站的安全性。
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应用中,只需一行代码就可以轻松集成。
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(); // 仅允许加载来自相同源的字体
// 禁止通过
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);
https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders
- End -
推荐阅读
Asp.net动态Web API的教程!
Kiota:基于OpenAPI的HTTP客户端代码生成器
盘点下5个Winform UI开源控件库
Scriban:高效、强大的.NET开源模板引擎,可用于邮件、文档生成!
一个C#开源工具库,集成了超过1000个扩展方法