如何在Laravel 9中有效防范Host Header Attack(主机头攻击)
Laravel 9 防范主机头攻击的解决方案
一、排查自定义中间件未触发的原因
- 调整中间件注册顺序:在
app/Http/Kernel.php中,将自定义的HostHeaderValidationMiddleware放在web中间件组的最前端,确保请求在进入路由匹配、认证逻辑前先经过主机头校验:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\HostHeaderValidationMiddleware::class, \App\Http\Middleware\TrustHosts::class, // 其他中间件... ], ];
- 修正中间件逻辑:确保自定义中间件的校验逻辑正确,非法主机直接拦截:
public function handle(Request $request, Closure $next) { $allowedHosts = ['yourdomain.com', 'www.yourdomain.com', '127.0.0.1:8000']; $requestHost = $request->getHost(); if (!in_array($requestHost, $allowedHosts)) { abort(403, 'Invalid Host Header'); } return $next($request); }
二、Laravel 层面的强化防范方法
1. 正确配置 TrustHosts 中间件
打开app/Http/Middleware/TrustHosts.php,明确指定允许的主机列表,非法请求会直接返回403:
public function hosts() { return [ 'yourdomain.com', 'www.yourdomain.com', '127.0.0.1:8000', // 本地开发环境 ]; }
2. 强制URL生成使用固定主机
Laravel默认会用请求Host生成重定向URL(比如登录跳转),可通过以下方式强制使用正确域名:
- 在
.env中设置固定域名:
APP_URL=https://yourdomain.com
- 在
AppServiceProvider的boot方法中强制指定URL根地址:
use Illuminate\Support\Facades\URL; public function boot() { URL::forceRootUrl(config('app.url')); // 如需强制HTTPS,可添加:URL::forceScheme('https'); }
3. 路由层面添加主机约束
给路由组绑定允许的主机,非法主机请求直接返回404:
Route::domain('yourdomain.com')->group(function () { // 业务路由 }); // 本地开发环境单独配置 if (app()->isLocal()) { Route::domain('127.0.0.1:8000')->group(function () { // 本地路由 }); }
三、PHP 层面的前置拦截
在public/index.php最开头添加校验,Laravel启动前就阻断非法请求:
$allowedHosts = ['yourdomain.com', 'www.yourdomain.com', '127.0.0.1:8000']; $requestHost = $_SERVER['HTTP_HOST'] ?? ''; if (!in_array($requestHost, $allowedHosts)) { http_response_code(403); echo 'Invalid Host Header'; exit; } // 后续Laravel启动代码...
内容的提问来源于stack exchange,提问作者Ninja Turtle
相关产品推荐
相关产品推荐

