2025年7月17日 星期四

[研究]Content-Security-Policy (CSP)弱點防護設定添加後會導致那些功能或設定無法運作?

[研究]Content-Security-Policy (CSP)弱點防護設定添加後會導致那些功能或設定無法運作?

2025-07-17

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20

********************************************************************************

ASP.NET WebForm 網站,請說明 Global.asax.cs 中添加下面後

Response.Headers.Add("Content-Security-Policy",
    "default-src 'self'; " +
    "script-src 'self'; " +
    "style-src 'self'; " +
    "font-src 'self'; " +
    "img-src 'self'; " +
    "frame-src 'self'; " +
    "object-src 'none'; " +
    "base-uri 'self'; " +
    "form-action 'self';"
);

會導致那些功能或設定無法運作

********************************************************************************

ChatGPT 說:

這是一個相對嚴格的 CSP 設定,以下是各設定的說明以及可能導致的功能失效或影響的場景:

📌 default-src 'self';

說明: 預設所有資源只允許來自本網站來源(同網域)。

影響:

  • 所有未明確指定來源類別的資源(如 media、connect)都會被限制只能來自 self。
  • 如使用外部 CDN 資源(圖片、API、影片)會被阻擋。

****************************************

📌 script-src 'self';

說明: 僅允許來自自己網站的 JavaScript 腳本。

影響:

  • ❌ 無法載入外部 JS,如 Google Analytics (www.googletagmanager.com)、Facebook SDK、CDN JavaScript(如 jQuery CDN)。
  • ❌ 不允許 inline script(如 <script>alert('Hi');</script>)或 eval()。
    • 若未加上 'unsafe-inline' 或 'unsafe-eval',會導致:
    • ClientScript.RegisterStartupScript()、ScriptManager.RegisterStartupScript() 插入的內嵌 JS 被阻擋。
    • 某些 AJAX Callback 或驗證 JS 無法執行。
  • ✅ 可正常執行來自本網站的 .js 檔案(只要是從相同網域載入的)。

****************************************

📌 style-src 'self';

說明: 僅允許來自本網站的 CSS 樣式表。

影響:

  • ❌ 禁止外部樣式表(如 https://fonts.googleapis.com)。
  • ❌ 不允許 <style> 標籤中內嵌的 CSS(除非加上 'unsafe-inline')。
    • 如 <div style="color:red;"> 可能失效。
    • 若動態產生樣式或使用 ASP.NET 內嵌樣式,樣式可能被瀏覽器拒絕執行。

****************************************

📌 font-src 'self';

說明: 僅允許來自本網站的字型檔。

影響:

❌ Google Fonts(fonts.gstatic.com)等外部字型載入會被阻擋。

✅ 自己網站的 .woff、.ttf 等可使用。

****************************************

📌 img-src 'self';

說明: 只允許自己網站的圖片資源。

影響:

❌ 外部圖片(如 <img src="https://example.com/logo.png">)無法顯示。

❌ 無法嵌入 base64 的圖片(若未加 'data:')。

****************************************

📌 frame-src 'self';

說明: 僅允許自己網域的 <iframe> 來源。

影響:

❌ 不能嵌入 YouTube、Google Maps、Facebook 等 iframe。

✅ 若自己網站內嵌自己網站的頁面,仍可用。

****************************************

📌 object-src 'none';

說明: 禁止 <object>、<embed>、<applet> 等用於 Flash、Silverlight、Java Applet 的元素。

影響:

✅ 增加安全性(防止老舊技術漏洞)。

❌ 若網站仍使用 Flash 等,會無法載入(大多數現代網站不受影響)。

📌 base-uri 'self';

說明: 僅允許 <base href="..."> 設定在同網域。

影響:

若你使用 <base href="https://cdn.example.com/">(來自外部)將會被阻擋。

****************************************

📌 form-action 'self';

說明: 表單的 action 屬性僅允許送出到同網域。

影響:

❌ 表單無法提交到外部網站(例如第三方金流、驗證服務、SSO 服務)。

✅ 增加防止 CSRF 的安全性。

****************************************

⚠️ 總結:會「無法運作」或「功能異常」的典型情況

功能影響說明
Google 字型被阻擋 (fonts.googleapis.com、fonts.gstatic.com)
外部 JavaScript (如 jQuery CDN)被阻擋 (code.jquery.com)
內嵌 JS無效,瀏覽器會擋下
內嵌 CSS無效,除非允許 'unsafe-inline'
第三方 iframe如 YouTube、Google Maps、Facebook 插件無法載入
表單送出到其他網站被阻擋,導致無法登入、支付等
圖片載入自其他網站無法顯示
base64 圖片 (data:image/png;base64...)被阻擋(需加上 img-src 'self' data:)

✅ 建議做法(視情況調整)

你可以依實際需求放寬部分限制,例如:

Response.Headers.Add("Content-Security-Policy",
    "default-src 'self'; " +
    "script-src 'self' 'unsafe-inline' https://www.google.com https://www.gstatic.com; " +
    "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " +
    "font-src 'self' https://fonts.gstatic.com; " +
    "img-src 'self' data:; " +
    "frame-src 'self' https://www.youtube.com; " +
    "object-src 'none'; " +
    "base-uri 'self'; " +
    "form-action 'self';"
);


********************************************************************************

設定了 unsafe-inline 或排除某些網址後,HCL AppScan 會否會報告有 CSP 相關弱點

ChatGPT 說:

是的,HCL AppScan 在掃描時若偵測到 Content-Security-Policy (CSP) 中設定了:

  • unsafe-inline
  • unsafe-eval
  • 或允許特定外部資源(如來自 CDN 的 JS、CSS)

通常會報告為「中風險」或「低風險」的 CSP 設定不安全弱點。

也就是你沒設定 CSP 防護,和放寬了 CSP 防護,HCL AppScan 都會報告弱點;

而你設定了嚴格 CSP,很多常用功能和設定可能就異常不能用。

(完)

相關

沒有留言:

張貼留言