下面给出一步到位的“删除/屏蔽 CSRF 校验”的三种常用做法,按场景挑一条即可。
① 最快热补丁(30 秒)
适合:本地调试、临时复现问题,用完立即恢复。
进到 Flarum 目录
cd vendor/flarum/core/src/Http/Middleware
cp CheckCsrfToken.php CheckCsrfToken.php.bak # 先备份
把校验逻辑短路
打开 CheckCsrfToken.php
,找到
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// 原有代码
$this->checkToken($request);
return $handler->handle($request);
}
改成
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// CSRF 直接放行
return $handler->handle($request);
}
清缓存
php flarum cache:clear
此时任何不带 token 的 POST 都会成功。
恢复:把 .bak
拷回来即可。
② 正规扩展方式(推荐)
适合:需要长期开关、可进 git。
建扩展目录
mkdir -p work/no-csrf
cd work/no-csrf
extend.php
<?php
use Flarum\Extend;
use Flarum\Http\Middleware\CheckCsrfToken;
return [
// 从 forum、api 两个中间件栈里移除
(new Extend\Middleware('forum'))->remove(CheckCsrfToken::class),
(new Extend\Middleware('api'))->remove(CheckCsrfToken::class),
];
composer.json
{
"name": "local/no-csrf",
"type": "flarum-extension",
"require": {"flarum/core": "^1.0|^2.0"}
}
注册 & 启用
composer config repositories.0 path work/no-csrf
composer require local/no-csrf:@dev
php flarum cache:clear
恢复校验
composer remove local/no-csrf
php flarum cache:clear
③ 只针对单条路由豁免(可选)
适合:只想给某个 webhook/action 放行,其他接口保留 CSRF。
在 extend.php
里加:
use Flarum\Extend\Middleware;
use Flarum\Http\Middleware\CheckCsrfToken;
use Psr\Http\Message\ServerRequestInterface;
return [
(new Middleware('api'))
->insertBefore(CheckCsrfToken::class, function ($request, $next) {
// 例:放过 /api/discussions 的 POST
if ($request->getMethod() === 'POST'
&& $request->getUri()->getPath() === '/api/discussions') {
return $next->handle($request);
}
// 其他请求继续走 CSRF
return (new CheckCsrfToken())->process($request, $next);
}),
];
一句话总结
“删除”CSRF 就是把它从中间件栈里摘掉:要么改 core 文件临时短路,要么写扩展 remove(CheckCsrfToken::class)
,调试完立刻恢复。