[技術解析] 002 一文看懂 X-Frame-Options、CSP、HttpOnly、CORS:前端安全機制 Q&

Q1. 為什麼會有 X-Frame-OptionsCSP (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 CookieCSPCORS 之間的差異與混淆是什麼?

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。


總結:這幾種機制「防什麼」?

  1. X-Frame-Options / CSP (frame-ancestors):防止網頁被惡意 <iframe> 外掛而進行點擊劫持。
  2. CSP:更廣的安全策略,限制資源來源,防止 XSS、惡意外部引入。
  3. HttpOnly Cookie:防止前端 JS 讀取 Cookie,降低 XSS 竊取 Session 的風險。
  4. CORS:管理跨網域請求,跟 XSS、CSRF 不是同一個層次,但也屬網站安全考量。

小提醒

  • 若你的網站同時需要兼顧「老舊瀏覽器」與「現代瀏覽器」的安全性,建議「X-Frame-Options 與 CSP」併用。
  • 請搭配 輸入/輸出驗證、CSRF Token、Cookie SameSite、HttpOnly… 等其他安全措施,才能更全面防護。
飛飛
飛飛