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

如何阻止Postman、cURL等HTTPS客户端访问Laravel站点?

Laravel 阻止Postman/cURL等非浏览器客户端访问站点的解决方案

当前你的Cors中间件拦截逻辑存在局限:仅通过HTTP_POSTMAN_TOKEN头识别Postman,但该请求头可被手动移除,且cURL等工具默认不会发送此头,导致拦截失效。以下是几种可行的改进方案:

方案1:通过User-Agent识别拦截

大多数非浏览器客户端会带有特征性的User-Agent,可据此拦截:

public function handle($request, Closure $next)
{
    $blockedAgents = ['PostmanRuntime', 'curl', 'Wget'];
    $userAgent = $request->server->get('HTTP_USER_AGENT', '');
    
    foreach ($blockedAgents as $agent) {
        if (str_contains(strtolower($userAgent), strtolower($agent))) {
            abort(403, 'Access denied');
        }
    }

    return $next($request)
        ->header('Access-Control-Allow-Origin', 'https://yourdomain.com')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Token-Auth, Authorization');
}

方案2:验证Origin请求头(更可靠)

浏览器发起合法跨域请求时会自动携带Origin头,而Postman/cURL默认不会发送该头(除非手动伪造)。可通过限制仅允许指定Origin来拦截非浏览器请求:

public function handle($request, Closure $next)
{
    $allowedOrigins = ['https://yourdomain.com'];
    $origin = $request->server->get('HTTP_ORIGIN');
    
    // 无Origin头或不在允许列表内则拦截
    if (!$origin || !in_array($origin, $allowedOrigins)) {
        abort(403, 'Access denied');
    }

    return $next($request)
        ->header('Access-Control-Allow-Origin', $origin)
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Token-Auth, Authorization');
}

方案3:组合多种校验方式(更严谨)

同时结合User-Agent和Origin校验,提升拦截准确性:

public function handle($request, Closure $next)
{
    $allowedOrigins = ['https://yourdomain.com'];
    $blockedAgents = ['PostmanRuntime', 'curl', 'Wget'];
    
    $origin = $request->server->get('HTTP_ORIGIN');
    $userAgent = $request->server->get('HTTP_USER_AGENT', '');

    // 校验Origin
    if (!$origin || !in_array($origin, $allowedOrigins)) {
        abort(403, 'Access denied');
    }

    // 校验User-Agent
    foreach ($blockedAgents as $agent) {
        if (str_contains(strtolower($userAgent), strtolower($agent))) {
            abort(403, 'Access denied');
        }
    }

    return $next($request)
        ->header('Access-Control-Allow-Origin', $origin)
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Token-Auth, Authorization');
}

注意事项

  • 上述方式无法完全避免请求伪造(比如手动设置合法Origin和User-Agent),若需保护敏感接口,建议额外添加API密钥验证或会话校验。
  • 确保中间件已正确注册到路由中,可在app/Http/Kernel.php的$middleware或$middlewareGroups里添加该Cors中间件。

内容的提问来源于stack exchange,提问作者Sohang Tyagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:39