2015-07-24 3 views
1

по умолчанию Laravel 5 validate & соответствует «токенам» для всех запросов [POST], как сказать L5 для проверки «GET, PUT &« Удалить »запросы тоже?Laravel 5: принудительно проверять [GET] запросы с использованием csrf

-> предотвратить любой запрос без уважительных лексем

спасибо,

ответ

0

Laravel проверки маркера для POST, PUT и DELETE. Вам не нужно проверять токен для запроса GET, если вы следуете системе RESTful.

Из документации:

Вам не нужно вручную проверить маркер CSRF на POST, PUT, DELETE или запросы. Связующее ПО VerifyCsrfToken HTTP проверяет токен в вводе запроса, совпадающий с токеном, хранящимся в сеансе.

http://laravel.com/docs/5.1/routing#csrf-protection

+0

thx, но как проверить [GET] тоже? – mwafi

+0

Что вы хотите проверить? –

+0

Я хочу предотвратить любой запрос без действительного токена – mwafi

1

Вы можете создать свой собственный Связующее ПО, которое будет заботиться о нем и заменить класс по умолчанию Laravel VerifyCsrfToken. В Laravel 5.3:

  1. Создайте свой новый межплатформенное php artisan make:middleware VerifyCsrfTokenAll

  2. Заменить класс промежуточного слоя в app/Http/Kernel.php - поиск по protected $middlewareGroups и заменить VerifyCsrfToken::class вашим новым ППО. Так он может выглядеть следующим образом:

    protected $middlewareGroups = [ 
        'web' => [ 
         \App\Http\Middleware\EncryptCookies::class, 
         \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
         \Illuminate\Session\Middleware\StartSession::class, 
         \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
         \App\Http\Middleware\VerifyCsrfTokenAll::class, 
         \Illuminate\Routing\Middleware\SubstituteBindings::class, 
        ], 
        ... 
    
  3. В app/Http/Middleware/VerifyCsrfTokenAll.php сделать его продлить первоначальный верификатор и просто переопределить метод isReading() как это один отвечает за обход запросов GET. Нечто подобное в зависимости от вашего случая использования:

    <?php 
    namespace App\Http\Middleware; 
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; 
    
    class VerifyCsrfTokenAll extends BaseVerifier 
    { 
        /** 
        * Determine if the HTTP request uses a ‘read’ verb. 
        * 
        * @param \Illuminate\Http\Request $request 
        * @return bool 
        */ 
        protected function isReading($request) 
        { 
         return false; 
         // return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']); 
        } 
    
    } 
    

Если вы только хотели проверить в на определенных маршрутах, то лучше сделать это в качестве маршрута промежуточного слоя, как в моем случае - я создал VerifyCsrfTokenGet промежуточное программное обеспечение и назначил его в app/Http/Kernel к $routeMiddleware группе, как это:

protected $routeMiddleware = [ 
    'csrf_get' => \App\Http\Middleware\VerifyCsrfTokenGet::class, 
    ... 

в app/Http/MIddleware/VerifyCsrfTokenGet.php я сделал проверку:

public function handle($request, Closure $next) 
{ 
    // check matching token from GET 
    $sessionToken = $request->session()->token(); 
    $token = $request->input('_token'); 
    if (! is_string($sessionToken) || ! is_string($token) || !hash_equals($sessionToken, $token)) { 
     throw new \Exception('CSRF token mismatch exception'); 
    } 

    return $next($request); 
} 

и, наконец, присвоен это любому маршруту в качестве csrf_middleware. Я хочу его проверить, например. в конструкторе некоторых из контроллеров:

class InvoicesController extends Controller 
{ 
    function __construct() 
    { 
     // define middleware 
     $this->middleware('csrf_get', ['only' => ['pay', 'createmail']]); 
    }