CSP 是浏览器提供的一层额外防御机制。即使页面中存在 XSS 漏洞,CSP 也能阻止恶意脚本的执行。你可以在控制器中为响应添加安全头。
在 ThinkPHP 6 中,有以下三种添加方式:
方式一:写在具体的控制器方法中(局部生效)
如果你只想给某一个特定的接口(比如文章详情接口)加上这个安全头,可以直接写在控制器里:
php
public function detail()
{
$data = Article::find(1);
// 在这里添加 CSP 响应头
$response = Response::create($data, 'json');
$response->header('Content-Security-Policy', "default-src 'self'; script-src 'self'");
return $response;
}
方式二:写在全局中间件中(全局生效,推荐)
安全响应头(如 CSP、X-Frame-Options 等)通常需要在所有的 HTTP 响应中统一注入。最干净、最规范的做法是创建一个全局中间件:
1. 创建中间件:
在终端执行:
cmd
php think make:middleware SecurityHeaders
2. 编写中间件逻辑 (app/middleware/SecurityHeaders.php):
php
<?php
declare(strict_types=1);
namespace app\middleware;
class SecurityHeaders
{
public function handle($request, \Closure $next)
{
// 先让请求继续往下走,拿到响应对象
$response = $next($request);
// 在响应真正发出前,统一注入安全头
$response->header([
'Content-Security-Policy' => "default-src 'self'; script-src 'self'",
'X-Content-Type-Options' => 'nosniff',
'X-Frame-Options' => 'DENY',
]);
return $response;
}
}
3. 注册全局中间件 (app/middleware.php):
php
<?php
// 全局中间件定义文件
return [
//其他中间件,可删除
app\middleware\Cors::class,
// 【新增】全局安全响应头中间件
app\middleware\SecurityHeaders::class,
];
方式三:在 Web 服务器层配置(性能最好,企业级推荐)
虽然 TP6 可以通过 PHP 代码设置响应头,但企业级开发中,安全响应头通常交由 Nginx 或 Apache 统一控制,这样不会消耗 PHP 的性能。
如果你使用的是 Nginx ,可以直接在 server 或 location 块中添加:
ngix
add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;
add_header X-Content-Type-Options "nosniff" always;