Q1. 為什麼會有 X-Frame-Options 與 CSP (frame-ancestors) 兩種方式來防止網頁被 <iframe>
外掛?
A1:
– X-Frame-Options 是比較早期的做法,像 IE8+ 舊版瀏覽器普遍支援。
– DENY
:禁止任何 <iframe>
外掛
– SAMEORIGIN
:只允許相同網域外掛
– ALLOW-FROM <URL>
:允許特定單一網域(但 Chrome 不支援)
– CSP:frame-ancestors 屬於 Content-Security-Policy 的一環,屬於「新式且更完整的安全機制」。
– 可同時允許多個網域,條件設定更彈性。
– 新一代瀏覽器幾乎都支援,建議優先使用。
結論:
– 如果需要照顧「非常舊的瀏覽器」,可以同時設定 X-Frame-Options;以現代環境為主則建議使用 CSP 的frame-ancestors
。
Q2. CSP 除了能做 frame-ancestors
,還能防止 XSS 或當作「前端防火牆」嗎?
A2:
– CSP 能限制所有外部資源(script、style、img…)的載入來源。
– 當有惡意腳本想注入,若來源未被 CSP 信任,就無法執行,達到防範 XSS 的目的。
– 因此,CSP 常被視為「前端防火牆」,可把不被信任的外部資源擋在外。
總結:CSP 不只防
<iframe>
,也能降低腳本攻擊風險,算是比較全方位的前端安全方案。
Q3. 舊版與新版瀏覽器支援度不同,是否需要同時保留 X-Frame-Options 與 CSP?
A3:
– 舊版瀏覽器(IE5、IE6、IE7…):不支援或只部分支援 CSP;X-Frame-Options 在 IE8+ 就已支援。
– 新版瀏覽器(Chrome、Firefox、Edge…):大多支援 CSP,且能使用更多進階功能(nonce、hash 等)。
– 如果你的使用者中,確實有人仍用非常老舊的瀏覽器,需要考慮同時保留 X-Frame-Options;否則在現代環境,CSP 已足以取代。
Q4. HttpOnly Cookie、CSP、CORS 之間的差異與混淆是什麼?
A4:
– HttpOnly Cookie:讓 JavaScript 讀不到 Cookie 資料,避免 XSS 攻擊時 Cookie 被竊取(尤其是 Session ID)。
– CSP:管控資源載入(script、style、iframe 等)的來源,能防止惡意腳本注入,但無法直接限制 JS 讀取 Cookie。
– CORS:決定是否允許「跨網域」來存取你的資源,跟 Cookie 是否可被 JS 讀取、或是否防 XSS,不是同一個概念。
關鍵:
– HttpOnly 是設定在 Cookie 上,目的在「防止 JS 存取 Cookie」。
– CSP 則是「限制外部資源(包含 JS)的載入路徑」。
– CORS 是「允許或禁止跨網域的 AJAX、Fetch 等請求」。
– 三者不相互取代,但都能提升網站安全。
Q5. CORS 能防止 XSS 或 CSRF 嗎?
A5:
– CORS(Cross-Origin Resource Sharing)主要規範「跨網域請求」的允許與限制,並不是直接用來防 XSS 或 CSRF。
– XSS:應透過 CSP、嚴謹的輸入驗證和輸出編碼等方式來防禦。
– CSRF:可透過 CSRF Token、SameSite Cookie 等機制來防範。
– 雖然它們常被一起討論,但 CORS 的功能焦點並不在防 XSS 或防 CSRF。
總結:這幾種機制「防什麼」?
- X-Frame-Options / CSP (frame-ancestors):防止網頁被惡意
<iframe>
外掛而進行點擊劫持。 - CSP:更廣的安全策略,限制資源來源,防止 XSS、惡意外部引入。
- HttpOnly Cookie:防止前端 JS 讀取 Cookie,降低 XSS 竊取 Session 的風險。
- CORS:管理跨網域請求,跟 XSS、CSRF 不是同一個層次,但也屬網站安全考量。
小提醒
- 若你的網站同時需要兼顧「老舊瀏覽器」與「現代瀏覽器」的安全性,建議「X-Frame-Options 與 CSP」併用。
- 請搭配 輸入/輸出驗證、CSRF Token、Cookie SameSite、HttpOnly… 等其他安全措施,才能更全面防護。