本文目录导读:

在 PHP 中设置 X-Frame-Options 头来防止点击劫持攻击,主要有以下几种方法:
使用 header() 函数(最简单)
在 PHP 页面顶部添加:
<?php
// 禁止所有页面被嵌入 iframe
header('X-Frame-Options: DENY');
// 或者只允许同源页面嵌入
header('X-Frame-Options: SAMEORIGIN');
?>
在 .htaccess 文件中设置(Apache)
# 禁止所有页面被嵌入 Header always set X-Frame-Options "DENY" # 或只允许同源 Header always set X-Frame-Options "SAMEORIGIN"
在 Nginx 配置中设置
add_header X-Frame-Options "SAMEORIGIN" always;
全局设置(所有页面)
在公共入口文件(如 index.php)或配置文件中设置:
<?php
// config.php 或公共函数中
function setSecurityHeaders() {
header('X-Frame-Options: DENY');
header('X-Content-Type-Options: nosniff');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');
}
// 在所有页面加载前调用
setSecurityHeaders();
?>
根据条件动态设置
<?php
// 允许特定域名嵌入
$allowed_domains = ['example.com', 'trusted-site.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (empty($referer) || strpos($referer, 'same-origin') !== false) {
header('X-Frame-Options: SAMEORIGIN');
} else {
header('X-Frame-Options: DENY');
}
?>
在框架中的应用
Laravel:
// 在中间件中设置
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('X-Frame-Options', 'SAMEORIGIN');
return $response;
}
WordPress:
// 在 functions.php 中添加
add_action('send_headers', function() {
header('X-Frame-Options: SAMEORIGIN');
});
重要提示
- 优先级:
DENY>SAMEORIGIN>ALLOW-FROM - 版本兼容:现代浏览器已不支持
ALLOW-FROM,建议使用Content-Security-Policy的frame-ancestors指令作为替代:
<?php
// 现代方法(支持 CSP)
header("Content-Security-Policy: frame-ancestors 'self' https://trusted.com");
// 兼容旧浏览器
header('X-Frame-Options: SAMEORIGIN');
?>
- 测试方法:可以使用以下代码测试是否生效:
<iframe src="http://your-site.com/page.php" width="300" height="300"></iframe>
如果页面未被嵌入,说明设置成功。
选择哪种方法取决于你的服务器配置和应用架构,推荐使用全局设置以确保所有页面都有安全保护。