【问题标题】:How to prevent Laravel Routes from being accessed directly (i.e. non-ajax requests)如何防止 Laravel 路由被直接访问(即非 ajax 请求)
【发布时间】:2015-12-11 15:06:18
【问题描述】:

在我的项目中,我将 Laravel 纯粹用作后端 api,所有前端都由 Angular javascript 处理。目前,可以直接访问 Laravel 路由,它会将 Json 中显示在浏览器中的所有数据都咳出。我想对其进行限制,以便 Laravel 只响应 Ajax 请求,而不响应其他请求。

我阅读了这篇文章 here,它为 Laravel 4 提供了一个解决方案,即在 filter.php 中添加限制。但从 Laravel 5.1 开始,不再使用过滤器,我相信中间件也可以用来做同样的事情。但是,我不确定如何继续将该 SO 答案中的 Laravel 4 解决方案从过滤器更改为中间件。

有人可以分享您关于如何防止 Laravel 5.1 路由被直接访问的想法吗?

使用filter.php 的 Laravel 4 解决方案: 在filter.php 中声明这个过滤器:

Route::filter('isAJAX', function()
{
    if (!Request::AJAX()) return Redirect::to('/')->with(array('route' => Request::path()));
});

然后将只希望通过 AJAX 访问的所有路由放入一个组中。在你的 routes.php 中:

Route::group(array('before' => 'isAJAX'), function()
{
    Route::get('contacts/{name}', ContactController@index); // Or however you declared your route

    ... // More routes
});

【问题讨论】:

    标签: laravel laravel-routing laravel-5.1 laravel-middleware laravel-filters


    【解决方案1】:

    使用此内容创建中间件文件app/Http/Middleware/OnlyAjax.php

    <?php 
    
    namespace App\Http\Middleware;
    
    class OnlyAjax
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, \Closure $next)
        {
            if ( ! $request->ajax())
                return response('Forbidden.', 403);
    
            return $next($request);
        }
    }
    

    然后在app/Http/Kernel.php文件中注册你的中间件

    <?php namespace App\Http;
    
    use Illuminate\Foundation\Http\Kernel as HttpKernel;
    
    class Kernel extends HttpKernel
    {
        /**
         * The application's global HTTP middleware stack.
         *
         * @var array
         */
        protected $middleware = [
            //... your original code
        ];
    
        /**
         * The application's route middleware.
         *
         * @var array
         */
        protected $routeMiddleware = [
            //... your original code
            'ajax' => \App\Http\Middleware\OnlyAjax::class,
        ];
    }
    

    最后将中间件附加到您希望仅通过 AJAX 访问的任何路由或路由组。即:

    /// File: routes/web.php
    
    // Single route
    Route::any('foo', 'FooController@doSomething')->middleware('ajax');
    
    // Route group
    Route::middleware(['ajax'])->group(function () {
        // ...
    });
    

    【讨论】:

    • 太棒了!正是我需要的。非常感谢@JaviStolz 这是一个巨大的帮助,因为我被困了很长时间。 V 很高兴 :) 我现在就试一试。
    • 手动向 HTTP 请求添加 X-Requested-With: XMLHttpRequest HTTP 标头可以轻松绕过。
    • 另一件事是使用 cors 过滤器仅允许来自特定域的请求以及 isAjax 中间件。
    • 还要确保对 api 路由的访问是通过访问令牌进行的,例如:在一定时间后过期的护照
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2021-10-05
    • 2012-05-22
    • 1970-01-01
    • 2020-11-01
    • 2016-07-16
    • 2010-12-17
    • 2011-04-28
    相关资源
    最近更新 更多