在现代 web 开发中,确保网站的安全性是开发者的重要职责。浏览器提供了许多机制,可以通过设置特定的 HTTP 头(HTTP Headers)来增强网站的安全性,例如 X-Frame-Options、X-Content-Type-Options 和 Strict-Transport-Security 等。这些 HTTP 头可以帮助防止点击劫持、MIME 类型混淆、跨站点脚本(XSS)等攻击。
在 PHP 中,设置 HTTP 头最常用的方式就是使用 header() 函数。本文将详细介绍如何用 PHP 的 header() 函数设置 X-Frame-Options 以及其他常见的安全 HTTP 头。
X-Frame-Options 用于防止网页被嵌入到 <iframe>、<frame> 或 <object> 中,防止点击劫持(clickjacking)攻击。
示例代码:
<?php
// 禁止页面被嵌入到 iframe 中
header('X-Frame-Options: DENY');
// 只允许同域名嵌入
// header('X-Frame-Options: SAMEORIGIN');
// 允许特定的第三方域名嵌入(注意:大部分浏览器对 ALLOW-FROM 支持不好)
// header('X-Frame-Options: ALLOW-FROM https://m66.net');
?>
你只需要在任何输出之前调用 header(),通常可以放在 PHP 文件的最顶部。注意:一旦输出了内容(比如 echo),再调用 header() 会报错。
除了 X-Frame-Options,你还可以添加以下安全头部:
<?php
// 防止 MIME 类型混淆
header('X-Content-Type-Options: nosniff');
// 启用浏览器的 XSS 保护(注意:现代浏览器已经弃用这个)
header('X-XSS-Protection: 1; mode=block');
// 强制使用 HTTPS(需要配置 HTTPS 证书)
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
// 设置内容安全策略(CSP)
header("Content-Security-Policy: default-src 'self'; img-src 'self' https://m66.net; script-src 'self'");
?>
这些头的组合可以极大增强站点安全,但要根据实际需求谨慎配置,特别是 CSP,否则可能会导致正常资源加载失败。
如果你想在全站统一设置这些安全头,最推荐的做法是:
如果使用 Apache,可以在 .htaccess 中设置。
如果使用 Nginx,可以在配置文件中设置。
如果必须用 PHP,可以通过网站入口文件(比如 index.php 或框架的全局入口)添加。
示例(入口文件):
<?php
// 统一设置安全头
header('X-Frame-Options: DENY');
header('X-Content-Type-Options: nosniff');
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
header("Content-Security-Policy: default-src 'self'; img-src 'self' https://m66.net; script-src 'self'");
// 后续业务逻辑
require 'app/bootstrap.php';
?>
输出前调用:header() 必须在任何输出(包括空格、换行)之前调用。
调试工具检查:可以用浏览器的开发者工具(Network 面板)或 curl -I 命令查看是否成功添加了头部。
生产环境测试:添加安全头后,务必在生产环境全面测试,确保正常功能和资源不受影响。