You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel+Nginx环境下如何防止Responsive FileManager被直接访问?

阻止Responsive FileManager被直接访问的解决方案

针对你的场景(Laravel 6 + TinyMCE 5 + Responsive FileManager 9.14.0),要限制RFM仅能从TinyMCE编辑器访问,不能通过http://www.myhost.test/filemanager/dialog.php直接打开,这里有几个可靠的解决方案:

方案一:修改RFM的dialog.php,引入Laravel认证和来源校验

因为RFM的入口文件dialog.php在public目录下,默认会被Nginx直接处理,不经过Laravel的中间件。我们可以在这个文件开头引入Laravel的环境,直接做登录校验和请求来源检查:

  1. 打开public/filemanager/dialog.php,在最顶部添加以下代码:
// 引入Laravel的自动加载和应用实例
require __DIR__.'/../../vendor/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
$app->make(\Illuminate\Contracts\Http\Kernel::class)->handle(
    \Illuminate\Http\Request::capture()
);

// 1. 校验用户是否已通过Laravel认证
if (!auth()->check()) {
    header("HTTP/1.1 403 Forbidden");
    echo "Unauthorized access";
    exit;
}

// 2. 校验请求来源是否是你的TinyMCE页面(比如create页面)
$referer = request()->headers->get('referer');
$createPageUrl = url('create'); // 替换成你的create页面实际URL
if (!$referer || strpos($referer, $createPageUrl) === false) {
    header("HTTP/1.1 403 Forbidden");
    echo "Access denied: Only accessible from TinyMCE editor";
    exit;
}

这样,直接访问dialog.php时,要么未登录被拦截,要么来源不是你的create页面也会被拒绝。

方案二:通过Laravel路由代理RFM请求,用中间件做校验

这个方案更符合Laravel的路由规范,把所有RFM的请求都交给Laravel处理,通过中间件统一做校验:

步骤1:修改Nginx配置

让/filemanager路径下的所有请求都转发到Laravel的index.php,这样才能经过Laravel的路由和中间件。在你的Nginx server块中添加:

location /filemanager {
    try_files $uri $uri/ /index.php?$query_string;
}

修改后记得重启Nginx生效。

步骤2:添加Laravel路由

在routes/web.php中添加路由组,绑定认证和自定义来源校验中间件:

use Illuminate\Support\Facades\Route;

Route::prefix('filemanager')
    ->middleware(['auth', 'check.tinymce.referer'])
    ->group(function () {
        // 处理dialog.php请求
        Route::get('/dialog.php', function () {
            return file_get_contents(public_path('filemanager/dialog.php'));
        });
        
        // 处理RFM的其他静态资源和AJAX请求
        Route::fallback(function () {
            $requestPath = request()->path();
            $filePath = public_path($requestPath);
            
            if (file_exists($filePath)) {
                return response()->file($filePath);
            }
            
            abort(404);
        });
    });

步骤3:创建自定义中间件校验请求来源

生成一个中间件来检查请求是否来自你的TinyMCE页面:

php artisan make:middleware CheckTinymceReferer

打开app/Http/Middleware/CheckTinymceReferer.php,修改内容:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckTinymceReferer
{
    public function handle(Request $request, Closure $next)
    {
        $referer = $request->headers->get('referer');
        $createPageUrl = route('create'); // 替换成你的create页面路由名称
        
        // 校验来源是否为create页面
        if (!$referer || strpos($referer, $createPageUrl) === false) {
            abort(403, 'Access denied: Only accessible from TinyMCE editor');
        }

        return $next($request);
    }
}

步骤4:注册中间件

在app/Http/Kernel.php的$routeMiddleware数组中添加:

protected $routeMiddleware = [
    // ...其他已存在的中间件
    'check.tinymce.referer' => \App\Http\Middleware\CheckTinymceReferer::class,
];

方案三:补充校验TinyMCE传递的参数(辅助方案)

TinyMCE调用RFM时,会自动传递field_id等参数,你可以在dialog.php中检查这些参数是否存在,作为额外的校验层:

// 在dialog.php开头添加
if (!isset($_GET['field_id'])) {
    header("HTTP/1.1 403 Forbidden");
    echo "Invalid request";
    exit;
}

注意:这个方案不能单独使用(参数可以被伪造),建议和前面的认证+来源校验方案结合使用。

内容的提问来源于stack exchange,提问作者Ould Abba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:03:02