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.

Thủ Thuật Máy Tính
fonte
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

Shobi
fonte
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

David
fonte
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

Saurabh Mistry
fonte
9

Que tal usar

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

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

Bonish Koirala
fonte
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

Karim Samir
fonte
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.

Prasna Lukito
fonte
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>
Aghnat Atqiya
fonte
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

Bram Janssen
fonte
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

samair ali
fonte
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

mangueira azimi
fonte
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'),
ismail bangee
fonte
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.

jeremykenedy
fonte
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.

engrhussainahmad
fonte
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',
];
Qasim Ali
fonte
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.

Flutterer
fonte
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.

Kamaro Lambert
fonte
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

Mathieu Ferre
fonte
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.

Anar Bayramov
fonte
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;
  });
});
Zia
fonte
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).

Toalha
fonte
1

abra o cmd da linha de comando em seu projeto.

1.command

php artisan config:cache

2.comand

php artisan route:clear
Biblbroks42
fonte
1

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

<meta name="csrf-token" content="{{ csrf_token() }}">
iranimij
fonte
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

Kakada Neang
fonte
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

Rafayel
fonte
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.

Ismael
fonte
1

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

Juan Angel
fonte
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

Splodge
fonte
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

Duy Nguyen
fonte
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.

Lyhong
fonte
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.

Kiafar
fonte