Вы можете создать свой собственный Связующее ПО, которое будет заботиться о нем и заменить класс по умолчанию Laravel VerifyCsrfToken. В Laravel 5.3:
Создайте свой новый межплатформенное php artisan make:middleware VerifyCsrfTokenAll
Заменить класс промежуточного слоя в 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,
],
...
В 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']]);
}
thx, но как проверить [GET] тоже? – mwafi
Что вы хотите проверить? –
Я хочу предотвратить любой запрос без действительного токена – mwafi