為了保證Web安全,其中Http安全標頭就是非常重要一個的措施。設定正確的安全頭可以增強網站的安全性,因為它們可以幫助防止各種網絡攻擊,如跨站腳本(XSS)、點擊劫持(Clickjacking)和內容類型嗅探(Content Type Sniffing)等。下面推薦一個開源項目,可以讓我們輕松地添加安全相關的HTTP頭到網站中。
01
項目簡介
NetEscapades.AspNetCore.SecurityHeaders 是一個輕便的的 ASP.NET Core 開源庫,旨在方便開發者向 ASP.NET Core 網站添加安全頭(Security Headers)。該庫提供了一套默認的安全頭,都是非常常見的,這些頭被廣泛應用于提高網站的安全性。
02
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();
// 創建一個新的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
該文章在 2024/9/4 15:00:18 編輯過