Laravel+Nginx环境下如何防止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的环境,直接做登录校验和请求来源检查:
- 打开
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

