Post request no Laravel - Erro - 419 Desculpe, sua sessão / 419 sua página expirou


88

Eu instalei o Laravel 5.7

Adicionou um formulário ao arquivo \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

Adicionado ao arquivo \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

Depois de enviar uma solicitação POST:

419 Desculpe, sua sessão expirou. Atualize e tente novamente.

Na versão, 5.6não havia esse problema.


Você já tentou adicionar um redirecionamento? Em vez de return;você pode ligar return redirect()->back();. Pelo que posso ver, o aplicativo não tem nada a ver após a solicitação de postagem. Talvez você possa redirecioná-lo para uma visualização após o processamento da solicitação.
— dcangulo

1
Estou tendo o mesmo problema. Quando eu mudo para a sessão do banco de dados, isso acontece e quando eu mudo de volta para filea SESSION_DRIVERsessão .envfunciona bem. Por que a sessão baseada em banco de dados não está funcionando.
— Junaid Qadir

Copiei seu código exato para uma nova instalação do laravel 5.7. Funcionou. Existe um problema em outro lugar.
— Kyle Wardle

este problema devido ao problema do token. Eu tentei executar o mesmo código como este, mas não obtive nenhum erro. Você deve fornecer mais informações, como o driver da sessão, exibição do valor _token no formulário. Além disso, você pode depurar a si mesmo neste arquivo da vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phplinha 67 para saber por quê
— bangnokia

1
Percebi que tinha usado a sessionsmesa para um propósito diferente. Depois de alterar o nome da tabela para um mais adequado e executar artisan session:tablee atualizar a migração, tudo está funcionando bem
— Junaid Qadir

Respostas:


113

Antes de ler a seguir verifique se você tem @csrfou {{ csrf_field() }}em sua forma como

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

A mensagem de erro Session Expired ou 419 Page Expired no larvel aparece porque em algum lugar a verificação do token csrf falha, o que significa que o App\Http\Middleware\VerifyCsrfToken::classmiddleware já está ativado. No formulário, a @csrfdiretiva blade já foi adicionada, o que também deve servir.

Então, a outra área a verificar é a sessão. A csrfverificação do token está diretamente envolvida com a sua sessão, portanto, você pode querer verificar se o driver da sessão está funcionando ou não, como um Redis configurado incorretamente pode causar um problema.

Talvez você possa tentar trocar o driver / software de sessão do .envarquivo, os drivers suportados são fornecidos abaixo

Drivers de sessão com suporte no Laravel 5, Laravel 6 e Laravel 7 (Doc Link)

  • file - as sessões são armazenadas em armazenamento / estrutura / sessões.
  • cookie - as sessões são armazenadas em cookies criptografados seguros.
  • database - as sessões são armazenadas em um banco de dados relacional.
  • memcached/ redis- as sessões são armazenadas em um desses armazenamentos rápidos baseados em cache.
  • array - as sessões são armazenadas em um array PHP e não serão persistidas.

Se o seu formulário funcionar depois de trocar o driver de sessão, então algo está errado com esse driver específico, tente corrigir o erro a partir daí.

Possíveis cenários propensos a erros

  • Provavelmente, as sessões baseadas em arquivo podem não funcionar por causa dos problemas de permissão com o /storagediretório (uma busca rápida no Google irá buscar a solução), lembre-se também de colocar 777 para o diretório nunca é a solução.

  • No caso do driver de banco de dados, sua conexão com o banco de dados pode estar errada ou a sessionstabela pode não existir ou pode estar configurada incorretamente (a parte de configuração errada foi confirmada como um problema conforme o comentário de @Junaid Qadir).

  • redis/memcached a configuração está errada ou está sendo manipulada por alguma outra parte do código no sistema ao mesmo tempo.

Pode ser uma boa ideia executar php artisan key:generatee gerar uma nova chave de aplicativo que, por sua vez, liberará os dados da sessão.

Limpar cache do navegador DIFÍCIL , descobri que o cromo e o firefox são os culpados mais do que consigo me lembrar.

Leia mais sobre por que as chaves do aplicativo são importantes


1
Às vezes, é só que os navegadores, principalmente o Chrome, não colocam o valor da sessão Set-Cookie porque é malformado ou não é padrão. Assim, o Laravel não encontrará nenhum valor de sessão existente na solicitação HTTP para comparar com o _tokenvalor recebido do FORM. Evite usar SESSION_DOMAIN=...com IP que as especificações de cookies do Chrome e HTTP consideram inseguros.
— KeitelDOG

Tenho o mesmo problema, mas não recebo o erro constantemente. Apenas ocorre de vez em quando. Eu acho que isso significa que não há problema com o driver de sessão, porque ele funciona 99% do tempo. Mas estou executando um aplicativo ao vivo e recebo reclamações de clientes de vez em quando. Porém, é muito raro. Estou usando o driver de sessão de arquivo. Alguém sabe por que isso acontece no meu caso? Obrigado
— TheAngelM97,

@ TheAngelM97 Você pode reproduzir facilmente este erro acessando a página de login ou de registro. Não faça nada por, talvez, mais de 30 minutos. Então, quando você clica em enviar, o 419 Page Expiredaparece. Para fins de usabilidade, como você diz a um usuário simples o que acabou de acontecer e como resolver?
— Pathros

38

Isso ocorre porque o formulário requer um csrf. Na versão 5.7, eles mudaram para @csrf

<form action="" method="post">
    @csrf
    ...

Referência: https://laravel.com/docs/5.7/csrf


6
Seu formulário inclui um token csrf. Não tenho certeza se ele editou mais tarde ou não.
— eResourcesInc de

sim, o formulário dele originalmente tem um csrfcampo, eu apenas olhei para o histórico de edição
— Dexter Bengil

13

caso 1: se você estiver executando um projeto em seu sistema local como 127.0.01: 8000,

então

adicione SESSION_DOMAIN=no seu arquivo .env

ou em seu config / session.php 'domain' => env('SESSION_DOMAIN', ''),

e então correr php artisan cache:clear

caso 2: se o projeto estiver sendo executado no servidor e você tiver um domínio como "meudominio.com"

adicione SESSION_DOMAIN=mydomain.comno seu arquivo .env

ou em seu config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

e então correr php artisan cache:clear


9

Que tal usar

{{ csrf_field() }} ao invés de @csrf

O erro 419 é principalmente devido a problemas de token csrf.


Você quer dizer {{ csrf_field() }}?
— Travis Britz

9

Eu uso o Laravel 5.7 e tive o mesmo problema e foi porque o token csrf não estava no formulário, então adicionando

@csrf

consertou o problema


7

Tente comentar \App\Http\Middleware\EncryptCookies::classem \app\Http\Kernel.php Tenho um problema semelhante e resolvi-o fazendo isso. Provavelmente não é a melhor solução porque a segurança, mas pelo menos funcionou.

Eu tentei anteriormente:

  • Limpar cache
  • Gerar nova chave de aplicativo
  • Executar meu aplicativo em vários navegadores (Chrome 70, Mozilla Firefox 57 e IE 11)
  • Execute meu aplicativo em outro computador
  • Comente \App\Http\Middleware\VerifyCsrfToken::classem\app\Http\Kernel.php
  • Comente \Illuminate\Session\Middleware\AuthenticateSession::classem\app\Http\Kernel.php
  • Faça upgrade e downgrade do Laravel (entre 5.6 e 5.7)

Mas nada disso funcionou para mim.

EDITAR

Meu caso aqui é que toda vez que eu logar, um novo arquivo de sessão será criado (O antigo ainda persiste, mas de repente esquecido. Verifique storage/framework/sessions) e um novo token CSRF é gerado. Portanto, o problema não é com VerifyCsrfToken.

Como @Vladd mencionou na seção de comentários, você nunca deve comentar \App\Http\Middleware\VerifyCsrfToken::class. Você deve verificar se enviou o CSRF TOKEN correto para o servidor.


1
Entre as maneiras que você mencionou, apenas comentar \ App \ Http \ Middleware \ VerifyCsrfToken :: class em \ app \ Http \ Kernel.php funcionou para mim.
— Lex Soft

1
Limpar cache, gerar nova chave de aplicativo + Remover cookies
— dobs

Você nunca deve c0mmenting \ App \ Http \ Middleware \ VerifyCsrfToken :: class. Por que você faria isso? Para criar seu próprio ponto fraco no app?
— Vladd

@dobs Obrigado por adicionar '+ Remover Cookies' porque eu estava recebendo um erro 419 mesmo depois de fazer tudo que podia e só funcionou quando limpei os cookies do navegador / tentei no modo anônimo.
— Niraj Pandey

6

mude seu @csrfem welcome.blade.php para<input type="hidden" name="_token" value="{{ csrf_token() }}">

então seu código é assim:

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>

6

Pode ser um problema com sua sessão. Depois de brincar com essas configurações, resolvi meu problema. Para mim, acabou sendo a última opção.

  • Se você estiver usando "arquivo" como driver de sessão, observe em armazenamento / estrutura / sessões se as sessões estão sendo salvas após uma atualização. Caso contrário, provavelmente é devido a permissões de pasta incorretas. Verifique se o seu armazenamento / pasta tem os direitos corretos
  • Tente desabilitar todo o Javascript em suas páginas (desabilitando-o via navegador ou dentro do código) e certifique-se de que 'http_only' => true,
  • Tente usar com e sem https
  • Certifique-se de que a variável SESSION_DRIVER NÃO seja nula
  • Tente alternar entre 'criptografar' => falso e 'criptografar' => verdadeiro,
  • Tente mudar o nome do cookie 'cookie' => 'laravelsession',
  • Tente definir seu SESSION_DOMAIN para seu domínio real OU nulo
  • Tente alternar entre 'seguro' => env ('SESSION_SECURE_COOKIE', falso) e 'seguro' => env ('SESSION_SECURE_COOKIE', verdadeiro),

Fonte: Laravel Session sempre muda a cada atualização / solicitação no Laravel 5.4


Sim, depois de tentar muitas outras coisas, o SESSION_SECURE_COOKIEswitch (mudou para false) fez isso por mim. (on localhost:8000)
— Marten Koetsier

SESSION_SECURE_COOKIE também era o problema para mim, eu mudei ao seguir um guia para otimização de sites.
— Bram Janssen

pra mim funciona com https mas não com http ... alguma ideia do porquê? obrigado pela ótima resposta, demorei horas para encontrá-lo.
— sharkyenergy,

4

adicione o token csrf e seu problema será resolvido. {{csrf_token}} ou @csrf


4

Para resolver este erro, você primeiro precisa inserir um dos seguintes comandos na tag do formulário.

@csrf OU {{ csrf_field }}

Se o seu problema não for resolvido, faça o seguinte: (Observe que um dos comandos acima deve estar na tag do formulário)

1. Insira um dos seguintes comandos na tag do formulário @csrfOU{{ csrf_field }}

2. Abra o arquivo .env e altere os valores para o "arquivo" na seção SESSION_DRIVER.

3.Então você deve redefinir o cache de laravel. digite os comandos abaixo no terminal

php artisan view:clear php artisan route:clear php artisan cache:clear

php artisan config:cache

4. Na etapa final, desconecte o projeto do servidor e clique novamente em php artisan serve

Espero que seu problema seja resolvido


3

Depois de tanto tempo resolvi assim

Meu caminho de instalação do laravel não era o mesmo definido no arquivo de configuração session.php

'domain' => env('SESSION_DOMAIN', 'example.com'),

2

Pode ser um exagero, mas você pode tentar isso:

// Formulário de chamada de rota nomeada com campo de token oculto adicionado.

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// Rota Nomeada

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// Adicione isso dentro do <head></head>bloco:

<meta name="_token" content="{!! csrf_token() !!}" />

Eu testei em meu local usando Homestead no Laravel 5.7 que foi instalado recentemente usando o instalador Laravel 2.0.1 e funcionou. Qual é o seu ambiente?

Teoria: Eu me pergunto se isso tem algo a ver com lâmina de renderização de HTML marcas com {{ }}vs. {!! !!}em seu ambiente ou como você está servindo-lo (por exemplo. php artisan serve). O que me faz pensar que é line 335de /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpdeve processar a mesma linha digitado manualmente acima.


Sim, legal, mas as <meta>tags devem ser colocadas dentro de <head>, não dentro de <body>. Não tenho certeza se o validador de HTML gostaria disso.
— emix

Eu diria que você está correto e isso deve ser movido para a cabeça.
— jeremykenedy

2

Não há problema no código. Eu verifiquei com o mesmo código que você escreveu com a nova instalação.

Código do formulário:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php código do arquivo:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

O resultado após o envio do formulário é: Resultado após o envio do formulário

Se você limpar o cache do navegador ou tentar com outro navegador, acho que vai consertar.


2

Uma abordagem rápida e ruim é ir para app \ http \ middleware \ verifycsrftoken.php e adicionar a rota na lista $ except. A solicitação de postagem será ignorada para a verificação do Token CSRF.

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

2

419 página este erro significa problema de segurança laravel significa campo de token csrf não está sendo usado corretamente.

use {{csrf_field}} e seu problema será resolvido.


2

Deve funcionar se você tentar todas estas etapas:

  1. Certifique-se de que sua sessão está bem configurada, a maneira mais fácil é torná-la um arquivo e certifique-se de que a pasta de armazenamento tenha permissão chmod 755, então em seu .envvocê configurá-lo como abaixo, o driver de sessão de arquivo é a maneira mais fácil de configurar.

    SESSION_DRIVER=file
    SESSION_DOMAIN=
    SESSION_SECURE_COOKIE=false
    
  2. Certifique-se de que a pasta Cache esteja limpa e gravável, você pode fazer isso executando o comando artisan abaixo.

    php artisan cache:clear
    
  3. Certifique-se de que as permissões de pasta estejam bem definidas, elas devem ser configuradas como a seguir:

    sudo chmod -R 755 storage
    sudo chmod -R 755 vendor
    sudo chmod -R 644 bootstrap/cache
    
  4. Certifique-se de que seu formulário tenha @csrftoken incluído.

Espero que isso resolva seu problema.


1

Na tua Http/Kernel.php

tente comentar esta linha:

\Illuminate\Session\Middleware\AuthenticateSession::class,

em sua matriz de middleware da web

pode ser a raiz do seu problema


1

No default não tive esse problema. Então, o que fiz foi chmod -R 644 sessions replicar o problema.

insira a descrição da imagem aqui

Depois, dei permissões para a pasta de sessões de chmod -R 755 sessions

agora meu código de projeto funciona novamente.

insira a descrição da imagem aqui

Isso acontece porque você armazena seu cache em um arquivo sem permissões de gravação.

O arquivo de configuração da sessão é armazenado em config / session.php. Certifique-se de revisar as opções disponíveis para você neste arquivo. Por padrão, o Laravel é configurado para usar o driver de sessão de arquivo, que funcionará bem para muitos aplicativos. Em aplicativos de produção, você pode considerar o uso de drivers memcached ou redis para um desempenho de sessão ainda mais rápido.

Soluções:

1 - Como eu fixei acima, você pode dar 755 permissão para a pasta de sessões. 2 - Você pode usar outra configuração de driver de sessão.

arquivo - as sessões são armazenadas em armazenamento / estrutura / sessões. cookie - as sessões são armazenadas em cookies criptografados seguros. banco de dados - as sessões são armazenadas em um banco de dados relacional. memcached / redis - as sessões são armazenadas em um desses armazenamentos rápidos baseados em cache. array - as sessões são armazenadas em um array PHP e não serão persistidas.

Tenha em mente; Se quiser usar memcached / redis, você precisará instalá-los no servidor ou o contêiner do docker redis deve estar em execução.


1

Na verdade, o CSRF é um token baseado em sessão. Adicione sua rota em um grupo de rotas e adicione um middleware que controla as sessões.

web é um middleware padrão em laravel e pode controlar as solicitações de sessão.

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

1

Se você já tem a diretiva csrf , pode ter alterado a maneira como as sessões são executadas.

Em config/session.php, verifique o campo 'seguro' . Deve ser falso se https não estiver disponível em seu servidor.

Você também pode colocar SESSION_SECURE_COOKIE=FALSEem seu .envarquivo (diretório raiz).


1

abra o cmd da linha de comando em seu projeto.

1.command

php artisan config:cache

2.comand

php artisan route:clear

1

Você também tem o csrf no cabeçalho do seu aplicativo?

<meta name="csrf-token" content="{{ csrf_token() }}">

1

Embora o formulário tenha @csrf, ele ainda mostra419 pages has expired

Eu resolvi isso após a SESSION_SECURE_COOKIEopção de atualização para false em config / session.php

'secure' => env('SESSION_SECURE_COOKIE', false)

do que limpar o cache


1

Vá para config / sessions.php

encontre a linha

'secure' => env('SESSION_SECURE_COOKIE', true),

mude para falso

'secure' => env('SESSION_SECURE_COOKIE', false),

Se este parâmetro for definido como TRUE, o navegador exigirá que você use o protocolo HTTPS, caso contrário, ele não armazenará a sessão. Como não é válido


1

Acabei de passar por isso e estou pairando aqui por uma resposta .. No meu caso, a solução foi limpar o histórico do navegador.


1

No meu caso, havia um?> No final de routes.php. Passei muito tempo lá ...


mesmo, esqueci de adicionar ?>ao final deweb.php
— msalihbindak

0

Eu simplesmente tive exatamente o mesmo problema e eu fui completamente estúpido. Desativei todos os campos do formulário (em vez de apenas o botão enviar) via javascript antes de enviar o referido formulário! Isso, é claro, fez com que todos os elementos do formulário não fossem enviados (incluindo os_token campo ), o que, por sua vez, gerou o erro 419!

Espero que isso ajude alguém após algumas horas de coçar a cabeça!

Entradas de formulário desabilitadas não aparecem na solicitação


0

Eu tenho esse problema há muito tempo. Lembrei-me de que causa permissão de storage/framework/sessions. Você pode querer alterá-lo por chmod -R 0777 storage/framework/sessionscomando. Funcionou para mim


0

No meu caso, é muito ridículo. Recebo o erro 419 quando coloco Auth::routes()no topo do arquivo de rota.

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

E eu corrigi o erro movendo Auth::routes();para o final do arquivo de rota.

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

Auth::routes();

Talvez possa ajudar no seu caso também. Boa sorte.


0

Observe que você receberá o erro 419 se estiver tentando enviar um arquivo grande que excede o limite de tamanho do arquivo de postagem. Nesse caso, você pode aumentar upload_max_filesize e post_max_size para uma quantidade razoável (por exemplo, 10M ou 20M depende do seu caso de uso e recursos), verifique aqui: https://stackoverflow.com/a/2184541/2100489

Mas isso pode causar problemas de consumo de recursos, por exemplo, largura de banda e armazenamento. Como solução, você pode verificar o tamanho do arquivo antes de enviar o formulário e exibir uma mensagem de aviso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.