6

Nel mio progetto, sto usando Laravel esclusivamente come backend API e tutto il frontend è gestito da Angular javascript. Al momento, è possibile accedere direttamente alle rotte di Laravel e toglierà tutti i dati in Json visualizzati nel browser. Voglio mettere una restrizione in modo che Laravel risponda solo alle richieste Ajax e nient'altro.Come impedire l'accesso diretto a Laravel Routes (ad esempio richieste non Ajax)

Ho letto questo post here che ha una soluzione per Laravel 4 che è aggiungendo una limitazione in filter.php. Ma a partire da Laravel 5.1, i filtri non sono più utilizzati e credo che il middleware possa essere usato per fare lo stesso. Tuttavia, non sono sicuro di come procedere cambiando la soluzione di Laravel 4 in quella risposta SO dal filtro al middleware.

Qualcuno può condividere le tue idee su come impedire l'accesso diretto a Laravel 5.1 per favore?

laravel 4 soluzione con filter.php: In filter.php dichiarare questo filtro:

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

Poi mettere tutte le rotte che si desidera accessibile solo tramite la tecnologia AJAX in un gruppo. Nel vostro routes.php:

Route::group(array('before' => 'isAJAX'), function() 
{ 
    Route::get('contacts/{name}', [email protected]); // Or however you declared your route 

    ... // More routes 
}); 

risposta

18

Creare il file middleware app/Http/Middleware/OnlyAjax.php con questo contenuto:

<?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); 
    } 
} 

quindi registrare il tuo middleware nel file 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, 
    ]; 
} 

E infine collegare il middleware per qualsiasi percorso che desideri rendere accessibile solo tramite AJAX. Ad esempio:

// File: app/Http/routes.php 
post('search/{model}', ['as' => 'search', 'middleware' => 'ajax', 'uses' => '[email protected]']); 
+0

È fantastico! Esattamente quello di cui ho bisogno. Grazie mille @JaviStolz Questo è un grandissimo aiuto dato che sono rimasto bloccato per molto tempo. V felice :) Darò una prova ora. – Neel

+1

Questo può essere facilmente aggirato aggiungendo manualmente un'intestazione HTTP 'X-Requested-With: XMLHttpRequest' alle richieste HTTP. – Epoc

+0

Un'altra cosa sarebbe utilizzare i filtri cors per consentire solo le richieste provenienti da un determinato dominio insieme al middleware isAjax. –