網(wǎng)站的安全對(duì)于任何一家公司都是非常重要的。為了保證Web安全,其中Http安全標(biāo)頭就是非常重要一個(gè)的措施。設(shè)定正確的安全頭可以增強(qiáng)網(wǎng)站的安全性,因?yàn)樗鼈兛梢詭椭乐垢鞣N網(wǎng)絡(luò)攻擊,如跨站腳本(XSS)、點(diǎn)擊劫持(Clickjacking)和內(nèi)容類型嗅探(Content Type Sniffing)等。下面推薦一個(gè)開源項(xiàng)目,可以讓我們輕松地添加安全相關(guān)的HTTP頭到網(wǎng)站中。
01
項(xiàng)目簡(jiǎn)介
NetEscapades.AspNetCore.SecurityHeaders 是一個(gè)輕便的的 ASP.NET Core 開源庫(kù),旨在方便開發(fā)者向 ASP.NET Core 網(wǎng)站添加安全頭(Security Headers)。該庫(kù)提供了一套默認(rèn)的安全頭,都是非常常見的,這些頭被廣泛應(yīng)用于提高網(wǎng)站的安全性。
02
X-Content-Type-Options: nosniff:防止瀏覽器嘗試“嗅探”響應(yīng)的內(nèi)容類型。Strict-Transport-Security:max-age=31536000; includeSubDomains(僅HTTPS響應(yīng)):強(qiáng)制瀏覽器通過HTTPS與服務(wù)器建立連接。X-Frame-Options: Deny(僅“document”響應(yīng)):防止網(wǎng)站被嵌入到iframe中。X-XSS-Protection: 1; mode=block(僅“document”響應(yīng)):?jiǎn)⒂脼g覽器的XSS過濾器。Referrer-Policy: strict-origin-when-cross-origin:控制HTTP請(qǐng)求的Referer頭部。Content-Security-Policy(CSP):定義哪些動(dòng)態(tài)資源是允許的,幫助防止XSS攻擊等。2、自定義安全頭:開發(fā)者可以根據(jù)需要自定義安全頭。3、內(nèi)容安全策略(CSP):精細(xì)控制哪些外部資源(如腳本、樣式表、圖片等)可以被加載到網(wǎng)頁(yè)上。4、權(quán)限策略(Permissions Policy):控制的是瀏覽器特性和API的使用,而不是資源加載。通過Permissions Policy,開發(fā)者可以確保敏感API(如地理位置、攝像頭等)不會(huì)被濫用。5、Nonce和哈希:對(duì)于需要內(nèi)聯(lián)腳本或樣式的情況,CSP支持使用Nonce(一次性數(shù)字)或哈希值來允許這些內(nèi)聯(lián)內(nèi)容。6、靈活性:可以根據(jù)需要啟用或禁用特定的安全頭,或者調(diào)整它們的配置,以滿足不同的安全需求。7、集成簡(jiǎn)單:該庫(kù)通過中間件的形式集成到ASP.NET Core應(yīng)用中,只需一行代碼就可以輕松集成。
03
使用方法
1、默認(rèn)安全頭
app.UseSecurityHeaders();
// 創(chuàng)建一個(gè)新的HeaderPolicyCollection實(shí)例,用于配置安全頭部
var policyCollection = new HeaderPolicyCollection()
// 添加X-Frame-Options頭部,設(shè)置為DENY,防止網(wǎng)站被嵌入到iframe中
.AddFrameOptionsDeny()
// 添加X-XSS-Protection頭部,設(shè)置為BLOCK,嘗試阻止跨站腳本攻擊
.AddXssProtectionBlock()
// 添加X-Content-Type-Options頭部,設(shè)置為nosniff,防止瀏覽器嘗試基于內(nèi)容“嗅探”響應(yīng)的內(nèi)容類型
.AddContentTypeOptionsNoSniff()
// 添加Strict-Transport-Security頭部,設(shè)置max-age為一年(秒為單位),并包含所有子域
// 這要求瀏覽器僅通過HTTPS與服務(wù)器通信
.AddStrictTransportSecurityMaxAgeIncludeSubDomains(maxAgeInSeconds: 60 * 60 * 24 * 365) // maxage = one year in seconds
// 添加Referrer-Policy頭部,設(shè)置為strict-origin-when-cross-origin
// 這控制了在跨源請(qǐng)求中是否發(fā)送Referer頭部,以及發(fā)送多少信息
.AddReferrerPolicyStrictOriginWhenCrossOrigin()
// 移除Server頭部,以減少信息泄露
.RemoveServerHeader()
// 添加Content-Security-Policy頭部,配置詳細(xì)的資源加載策略
.AddContentSecurityPolicy(builder =>
{
// 禁止從任何源加載對(duì)象(如插件)
builder.AddObjectSrc().None();
// 僅允許表單操作(如提交)到同一源
builder.AddFormAction().Self();
// 禁止將當(dāng)前頁(yè)面作為frame的祖先
builder.AddFrameAncestors().None();
})
// 添加Cross-Origin-Opener-Policy頭部,設(shè)置為same-origin
// 這控制了哪些文檔可以通過window.open(), window.createPopup(), 或類似的方法打開
.AddCrossOriginOpenerPolicy(builder =>
{
builder.SameOrigin();
})
// 添加Cross-Origin-Embedder-Policy頭部,設(shè)置為require-corp
// 這要求嵌入的文檔通過COEP報(bào)頭聲明它們是COOP兼容的
.AddCrossOriginEmbedderPolicy(builder =>
{
builder.RequireCorp();
})
// 添加Cross-Origin-Resource-Policy頭部,設(shè)置為same-origin
// 這控制了哪些源可以加載資源(如圖片、腳本等)
.AddCrossOriginResourcePolicy(builder =>
{
builder.SameOrigin();
})
// 添加自定義的HTTP頭部
.AddCustomHeader("X-My-Test-Header", "Header value");
// 使用配置好的安全頭部策略
app.UseSecurityHeaders(policyCollection);
3、移除服務(wù)器響應(yīng)標(biāo)頭
var host = new WebHostBuilder()
.UseKestrel(options => options.AddServerHeader = false)
4、內(nèi)容安全策略
// 創(chuàng)建一個(gè)HeaderPolicyCollection實(shí)例,用于定義和管理HTTP響應(yīng)的安全頭
var policyCollection = new HeaderPolicyCollection()
.AddContentSecurityPolicy(builder =>
{
// 添加策略以自動(dòng)將不安全的請(qǐng)求(如HTTP)升級(jí)到HTTPS
builder.AddUpgradeInsecureRequests(); // upgrade-insecure-requests
// 阻止所有混合內(nèi)容(HTTPS頁(yè)面中的HTTP資源)
builder.AddBlockAllMixedContent(); // block-all-mixed-content
// 指定用于接收CSP違規(guī)報(bào)告的URI
builder.AddReportUri() // report-uri: https://report-uri.com
.To("https://report-uri.com");
// 定義默認(rèn)的源策略,僅允許加載當(dāng)前來源和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() // 允許與當(dāng)前源建立連接
.From("http://testUrl.com"); // 允許與http://testUrl.com建立連接
// 定義允許加載的字體源
builder.AddFontSrc() // font-src 'self'
.Self(); // 僅允許加載來自相同源的字體
// 禁止通過<object>、<embed>或<applet>標(biāo)簽加載資源
builder.AddObjectSrc() // object-src 'none'
.None(); // 禁用<object>、<embed>或<applet>
// 定義表單動(dòng)作源,即限制哪些源可以處理表單提交
builder.AddFormAction() // form-action 'self'
.Self(); // 僅允許表單提交到當(dāng)前源
// 定義圖片資源只能來自HTTPS源
builder.AddImgSrc() // img-src https:
.OverHttps(); // 僅允許HTTPS協(xié)議的圖片資源
// 定義腳本資源策略,允許加載來自相同源的腳本,允許內(nèi)聯(lián)腳本和eval,并報(bào)告樣本
builder.AddScriptSrc() // script-src 'self' 'unsafe-inline' 'unsafe-eval' 'report-sample'
.Self() // 允許加載來自相同源的腳本
.UnsafeInline() // 允許內(nèi)聯(lián)腳本
.UnsafeEval() // 允許使用eval()等函數(shù)
.ReportSample(); // 報(bào)告腳本樣本以供審查
// 定義樣式資源策略,允許加載來自相同源的樣式,并啟用嚴(yán)格動(dòng)態(tài)檢查
builder.AddStyleSrc() // style-src 'self' 'strict-dynamic'
.Self() // 允許加載來自相同源的樣式
.StrictDynamic(); // 啟用嚴(yán)格動(dòng)態(tài)檢查
// 定義媒體資源只能來自HTTPS源
builder.AddMediaSrc() // media-src https:
.OverHttps(); // 僅允許HTTPS協(xié)議的媒體資源
// 定義可以嵌入當(dāng)前頁(yè)面的框架的源,此處禁用所有框架嵌入
builder.AddFrameAncestors() // frame-ancestors 'none'
.None(); // 禁止任何源嵌入當(dāng)前頁(yè)面
// 定義基準(zhǔn)URI,限制頁(yè)面內(nèi)基礎(chǔ)URI(如<base>標(biāo)簽)的來源
builder.AddBaseUri() // base-uri 'self'
.Self(); // 僅允許基礎(chǔ)URI與當(dāng)前源相同
// 定義可以嵌入<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、權(quán)限策略
// 創(chuàng)建一個(gè)HeaderPolicyCollection實(shí)例,用于存儲(chǔ)和配置各種安全策略
var policyCollection = new HeaderPolicyCollection()
// 添加Permissions Policy(功能策略),用于控制網(wǎng)頁(yè)可以使用哪些Web功能
.AddPermissionsPolicy(builder =>
{
// 允許頁(yè)面從自身源('self')或指定的URL(http://testUrl.com)訪問加速度計(jì)
builder.AddAccelerometer()
.Self()
.For("http://testUrl.com");
// 允許頁(yè)面從自身源訪問環(huán)境光傳感器
builder.AddAmbientLightSensor()
.Self()
.For("http://testUrl.com");
// 允許頁(yè)面自動(dòng)播放媒體內(nèi)容,僅從自身源
builder.AddAutoplay()
.Self();
// 禁止頁(yè)面訪問攝像頭
builder.AddCamera()
.None();
// 允許頁(yè)面從自身源加載加密媒體
builder.AddEncryptedMedia()
.Self();
// 允許頁(yè)面全屏模式,對(duì)所有源
builder.AddFullscreen()
.All();
// 禁止頁(yè)面訪問地理位置
builder.AddGeolocation()
.None();
// 禁止頁(yè)面訪問陀螺儀
builder.AddGyroscope()
.None();
// 禁止頁(yè)面訪問磁力計(jì)
builder.AddMagnetometer()
.None();
// 禁止頁(yè)面訪問麥克風(fēng)
builder.AddMicrophone()
.None();
// 禁止頁(yè)面訪問MIDI設(shè)備
builder.AddMidi()
.None();
// 禁止頁(yè)面執(zhí)行支付請(qǐng)求
builder.AddPayment()
.None();
// 禁止頁(yè)面使用畫中畫模式
builder.AddPictureInPicture()
.None();
// 禁止頁(yè)面訪問揚(yáng)聲器
builder.AddSpeaker()
.None();
// 禁止頁(yè)面執(zhí)行同步XHR請(qǐng)求
builder.AddSyncXHR()
.None();
// 禁止頁(yè)面訪問USB設(shè)備
builder.AddUsb()
.None();
// 禁止頁(yè)面訪問VR設(shè)備
builder.AddVR()
.None();
// 添加自定義功能策略,例如限制Flash插件的使用
builder.AddCustomFeature("plugin-types", "application/x-shockwave-flash");
// 添加自定義的iframe策略,允許從自身源或指定URL加載iframe
builder.AddCustomFeature("iframe")
.Self()
.For("http://testUrl.com");
});
// 應(yīng)用前面定義的安全策略頭部到應(yīng)用程序響應(yīng)中
app.UseSecurityHeaders(policyCollection);
04
項(xiàng)目地址
https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders
該文章在 2024/9/4 15:00:18 編輯過