本文目录导读:

- 使用
header()函数(最常用) - 在 PHP 配置文件中全局设置
- 使用框架(Laravel 示例)
- 动态设置根据不同情况
- 完整的 .htaccess 安全头配置
- 验证是否设置成功
- 注意事项
- 测试验证
- 常见错误处理
- 完整示例文件
在 PHP 中设置 X-Content-Type 响应头(通常指 X-Content-Type-Options)有多种方法,以下是完整指南:
使用 header() 函数(最常用)
<?php
// 设置 X-Content-Type-Options 响应头
header('X-Content-Type-Options: nosniff');
// 也可以设置其他相关安全头
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
?>
在 PHP 配置文件中全局设置
通过 .htaccess(Apache)
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
</IfModule>
通过 php.ini
; 在 php.ini 中添加 ; 注意:php.ini 不能直接设置响应头,需使用 auto_prepend_file auto_prepend_file = /path/to/security-headers.php
然后在 security-headers.php 中:
<?php
header('X-Content-Type-Options: nosniff');
?>
使用框架(Laravel 示例)
Laravel 中间件
<?php
namespace App\Http\Middleware;
use Closure;
class SecurityHeaders
{
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('X-Content-Type-Options', 'nosniff');
return $response;
}
}
注册中间件后,在 app/Http/Kernel.php:
protected $middleware = [
\App\Http\Middleware\SecurityHeaders::class,
];
动态设置根据不同情况
<?php
// 根据文件类型设置
$content_type = 'text/html';
switch ($content_type) {
case 'application/json':
header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');
break;
case 'image/png':
header('Content-Type: image/png');
header('X-Content-Type-Options: nosniff');
break;
default:
header('Content-Type: text/html; charset=utf-8');
break;
}
echo $content;
?>
完整的 .htaccess 安全头配置
<IfModule mod_headers.c>
# 防止 MIME 嗅探
Header set X-Content-Type-Options "nosniff"
# XSS 防护
Header set X-XSS-Protection "1; mode=block"
# 点击劫持防护
Header set X-Frame-Options "SAMEORIGIN"
# 防止读取 Referrer 信息
Header set Referrer-Policy "strict-origin-when-cross-origin"
# CSP 内容安全策略
Header set Content-Security-Policy "default-src 'self'"
</IfModule>
验证是否设置成功
<?php
// 检查当前响应头
$headers = headers_list();
foreach ($headers as $header) {
echo $header . "<br>";
}
// 或者使用新的 headers_sent() 函数检查
if (!headers_sent()) {
header('X-Content-Type-Options: nosniff');
}
?>
注意事项
- 必须在任何输出之前调用
header()函数 - 使用
headers_sent()检查是否已有输出 - 建议搭配其他安全头 一起使用
<?php
// 最佳实践示例
ob_start(); // 开启输出缓冲
// 设置所有安全头
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: no-referrer');
header('Content-Security-Policy: default-src \'self\'');
ob_end_flush(); // 输出缓冲并关闭
?>
测试验证
<!-- HTML 测试 -->
<script>
fetch('your-api.php', {
headers: {
'Content-Type': 'text/html'
}
}).then(response => {
console.log(response.headers.get('X-Content-Type-Options'));
});
</script>
常见错误处理
<?php
// 如果遇到 "headers already sent" 错误
if (!headers_sent()) {
header('X-Content-Type-Options: nosniff');
} else {
// 记录错误或使用 JavaScript 方式补充
error_log('Headers already sent');
}
?>
完整示例文件
创建 security.php:
<?php
// 安全响应头配置
class SecurityHeaders {
public static function apply() {
if (headers_sent()) {
return false;
}
// 设置安全头
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
header('Referrer-Policy: strict-origin-when-cross-origin');
return true;
}
}
// 使用
SecurityHeaders::apply();
?>
这样配置后,你的 PHP 应用就会自动包含 X-Content-Type-Options 安全头,防止 MIME 类型混淆攻击。