TP6 防范XSS攻击 响应头防御(设置内容安全策略 :CSP)

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;
相关推荐
刚子编程4 小时前
我用 ASP.NET Core 做了个水稻病虫害检查系统
后端·asp.net
谢亮_vipxieliang4 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
码事漫谈7 小时前
三步改掉 AI 味,附可直接复制的去 AI 味提示词
后端
IT_陈寒7 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_7 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
程序猿_极客7 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
明月_清风8 小时前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github
bug菌8 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
leobertlan8 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端
加我攻城狮9 小时前
当大模型把「景区」定位到附近公共厕所:我的 AI 旅行小程序踩坑实录
后端·微信