context.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self'; frame-src 'self'");

await next();
});

此代碼本質上創建了一個中間件,將 CSP 標頭添加到來自我們服務器的所有響應中。

現在您可以檢查所有響應標頭是否包含上面提到的 CSP 配置(如果之前沒有的話)。 

瀏覽器將強制執行任何更改,很可能會破壞您的頁面并顯示許多警報。

實施適當的內容安全政策需要進行大量修改和適當測試,這需要一些時間。因此,現在,讓我們在網站正常運行的同時解決眼前的錯誤。 

為此,我們將使用Content-Security-Policy-Report-Only指令。只需將代碼更改為以下內容:

app.Use(async (context, next) => {
context.Response.Headers.Add("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self'; style-src 'self'; font-src 'self'; img-src 'self'; frame-src 'self'");

await next();
});

使用“僅報告”會使瀏覽器不再強制執行指令,但顯示相應的違規警報。 

這種行為對于平臺安全性不重要的開發環境很有幫助,但開發人員需要了解任何違規行為才能充分解決。

處理 CSP 錯誤

我們知道,在瀏覽器開發者控制臺中看到所有這些警報可能會令人感到害怕。但別擔心。一旦您了解了瀏覽器告訴您的內容,解決這些錯誤就非常簡單了。

開發者控制臺報告將指導您改進政策指令并進行必要的更新。 

我們的第一步應該是確認瀏覽器報告的資源確實合法并且對于應用程序的正常運行是必要的。 

例如,我們可以看到我們的應用程序正在請求以下內容:

當然,所有這些都是來自可信來源的有效資源。

獲得資源列表后,您可以按照如下方式將它們添加到每個相應來源的允許列表中:

app.Use(async (context, next) => {
context.Response.Headers.Add("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' https://code.jquery.com/jquery-3.5.1.min.js https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.js https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js; style-src 'self' https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css; font-src 'self' https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-brands-400.woff2 https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-brands-400.woff https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-brands-400.ttf https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-regular-400.woff2 https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-regular-400.woff https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-regular-400.ttf https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-solid-900.woff2 https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-solid-900.woff https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/webfonts/fa-solid-900.ttf; img-src 'self'; frame-src 'self'");

await next();
});

這樣做之后,大多數警報就會消失。

此外,如果您想啟用來自特定域的所有資源,您可以通過在指令中指定域來實現。

app.Use(async (context, next) => {
context.Response.Headers.Add("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' https://code.jquery.com https://cdnjs.cloudflare.com https://stackpath.bootstrapcdn.com https://cdn.jsdelivr.net; style-src 'self' https://stackpath.bootstrapcdn.com https://cdnjs.cloudflare.com; font-src 'self' https://cdnjs.cloudflare.com; img-src 'self'; frame-src 'self'");

await next();
});

在線違規

現在,我們的 HTML 中的內聯代碼怎么樣? 

嗯,我們可以采取一些措施來解決這些違規行為。

第一種(推薦)方法是將所有內聯代碼和樣式移動到單獨的文件并引用它。 

這樣,您可以確保應用程序的安全性并保持其一致性。

但是,如果您的情況無法做到這一點,您可以將代碼移動到<script/><style/>標簽,并使用 SHA 哈希鍵來告訴瀏覽器此標簽中的代碼是允許的。 

您可以使用 SHA256 算法對標簽內的代碼進行哈希處理來生成哈希鍵。方便的是,瀏覽器已經在警報本身中計算了此哈希值,因此您可以輕松地將其添加到指令中。

app.Use(async (context, next) => {
context.Response.Headers.Add("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' https://code.jquery.com https://cdnjs.cloudflare.com https://stackpath.bootstrapcdn.com https://cdn.jsdelivr.net; style-src 'self' https://stackpath.bootstrapcdn.com https://cdnjs.cloudflare.com; font-src 'self' https://cdnjs.cloudflare.com; img-src 'self'; frame-src 'self'");

await next();
});

此外,如果您不想使用 SHA 哈希,您可以使用所謂的“nonce”標簽屬性并將其添加到相應的標簽中。 

該解決方案本質上具有相同的目的,但必須使用一些服務器端代碼來更新每個請求。

最后,一旦所有更改完成,請記住更新指令并刪除生產中的“僅報告”。

.NET 內容安全策略指南:它是什么以及如何啟用它圖像

確保內容安全

構建強大且安全的網絡平臺需要廣泛的開發、基礎設施和安全基礎知識。 

保護我們的應用程序可能是一個非常復雜且漫長的過程。我們很容易迷失在文章和論壇的迷宮中。盡管如此,我們必須盡可能多地解決安全問題和漏洞。 

此外,確保我們平臺的彈性和用戶信息的安全是一個關鍵問題,而且隨著時間的推移變得越來越復雜。

.NET 是一個強大而直接的平臺,可用于構建強大而靈活的 Web 應用程序。此外,它使防范 CSP 漏洞的工作變得非常清晰;無需擺弄復雜的配置或危險的設置。

文章來源:.NET Content Security Policy Guide: What It Is and How to Enable It

上一篇:

動態應用的安全測試vs滲透測試

下一篇:

Angular破損的身份驗證指南:示例和預防措施
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費