[研究]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 設定不安全弱點。
相關
沒有留言:
張貼留言