首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP/Nginx/Apache 禁止頁面被 iframe 嵌入:X-Frame-Options 與 CSP 實戰

     編輯:PHP 綜合知識

防止點擊劫持,需設置響應頭 X-Frame-Options 或現代 Content-Security-Policy: frame-ancestors。

三種模式對比

值行為適用場景
DENY完全禁止嵌入高安全頁面(登錄、支付、後台)
SAMEORIGIN僅允許同源嵌入大多數業務頁面(推薦默認)
ALLOW-FROM https://example.com允許指定域嵌入(已棄用,瀏覽器支援度低)跨域嵌入需求(改用 CSP)

PHP 設置

<?php
// 必須在任何輸出前
header('X-Frame-Options: SAMEORIGIN');
// 現代 CSP 替代(支援多域、更靈活)
header("Content-Security-Policy: frame-ancestors 'self' https://trusted.partner.com;");

Nginx 配置

# 全站
add_header X-Frame-Options SAMEORIGIN always;

# 或特定 location
location /admin/ {
    add_header X-Frame-Options DENY always;
    add_header Content-Security-Policy "frame-ancestors 'none';" always;
}

Apache 配置(需 mod_headers)

# .htaccess 或 httpd.conf
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self';"

驗證方法

curl -I https://example.com/page
# 應包含
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'

瀏覽器行為

  • 違規嵌入時:Console 報錯 Refused to display in a frame because X-Frame-Options set to SAMEORIGIN,iframe 顯示空白或瀏覽器默認錯誤頁。
  • X-Frame-Options 不支援多域,ALLOW-FROM 已被 Chrome/Firefox/Edge 棄用。
  • 最佳實踐:同時發送 X-Frame-Options: SAMEORIGIN(舊瀏覽器兼容)+ CSP: frame-ancestors 'self' ...(現代標準)。

框架集成示例

  • Laravel:中間件 FrameGuard 或 spatie/laravel-csp。
  • Symfony:NelmioSecurityBundle 配置 frame_ancestors。
  • CodeIgniter:MY_Controller 構造函數 header('X-Frame-Options: SAMEORIGIN');。
  • ThinkPHP:配置 default_header 或行為擴展。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved