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.6
não havia esse problema.
return;
você pode ligarreturn 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.file
aSESSION_DRIVER
sessão.env
funciona bem. Por que a sessão baseada em banco de dados não está funcionando.vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
linha 67 para saber por quêsessions
mesa para um propósito diferente. Depois de alterar o nome da tabela para um mais adequado e executarartisan session:table
e atualizar a migração, tudo está funcionando bemRespostas:
Antes de ler a seguir verifique se você tem
@csrf
ou{{ 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::class
middleware já está ativado. No formulário, a@csrf
diretiva blade já foi adicionada, o que também deve servir.Então, a outra área a verificar é a sessão. A
csrf
verificaçã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
.env
arquivo, os drivers suportados são fornecidos abaixoDrivers 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
/storage
diretó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
sessions
tabela 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:generate
e 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
fonte
_token
valor recebido do FORM. Evite usarSESSION_DOMAIN=...
com IP que as especificações de cookies do Chrome e HTTP consideram inseguros.419 Page Expired
aparece. Para fins de usabilidade, como você diz a um usuário simples o que acabou de acontecer e como resolver?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
fonte
csrf
campo, eu apenas olhei para o histórico de ediçãoentão
adicione
SESSION_DOMAIN=
no seu arquivo .envou em seu config / session.php
'domain' => env('SESSION_DOMAIN', ''),
e então correr
php artisan cache:clear
adicione
SESSION_DOMAIN=mydomain.com
no seu arquivo .envou em seu config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
e então correr
php artisan cache:clear
fonte
Que tal usar
{{ csrf_field() }}
ao invés de@csrf
O erro 419 é principalmente devido a problemas de token csrf.
fonte
{{ csrf_field() }}
?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
consertou o problema
fonte
Tente comentar
\App\Http\Middleware\EncryptCookies::class
em\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:
\App\Http\Middleware\VerifyCsrfToken::class
em\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
em\app\Http\Kernel.php
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.fonte
mude seu
@csrf
em 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>
fonte
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.
Fonte: Laravel Session sempre muda a cada atualização / solicitação no Laravel 5.4
fonte
SESSION_SECURE_COOKIE
switch (mudou parafalse
) fez isso por mim. (onlocalhost:8000
)adicione o token csrf e seu problema será resolvido. {{csrf_token}} ou @csrf
fonte
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
@csrf
OU{{ 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
fonte
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'),
fonte
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 335
de/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
deve processar a mesma linha digitado manualmente acima.fonte
<meta>
tags devem ser colocadas dentro de<head>
, não dentro de<body>
. Não tenho certeza se o validador de HTML gostaria disso.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 é:
Se você limpar o cache do navegador ou tentar com outro navegador, acho que vai consertar.
fonte
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', ];
fonte
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.fonte
Deve funcionar se você tentar todas estas etapas:
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
.env
você 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
Certifique-se de que a pasta Cache esteja limpa e gravável, você pode fazer isso executando o comando artisan abaixo.
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
Certifique-se de que seu formulário tenha
@csrf
token incluído.Espero que isso resolva seu problema.
fonte
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
fonte
No default não tive esse problema. Então, o que fiz foi
chmod -R 644 sessions
replicar o problema.Depois, dei permissões para a pasta de sessões de
chmod -R 755 sessions
agora meu código de projeto funciona novamente.
Isso acontece porque você armazena seu cache em um arquivo sem permissões de gravação.
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.
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.
fonte
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; }); });
fonte
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=FALSE
em seu.env
arquivo (diretório raiz).fonte
abra o cmd da linha de comando em seu projeto.
1.command
2.comand
fonte
Você também tem o csrf no cabeçalho do seu aplicativo?
<meta name="csrf-token" content="{{ csrf_token() }}">
fonte
Embora o formulário tenha
@csrf
, ele ainda mostra419 pages has expired
Eu resolvi isso após a
SESSION_SECURE_COOKIE
opção de atualização para false em config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
do que limpar o cache
fonte
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
fonte
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.
fonte
No meu caso, havia um?> No final de routes.php. Passei muito tempo lá ...
fonte
?>
ao final deweb.php
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
fonte
Eu tenho esse problema há muito tempo. Lembrei-me de que causa permissão de
storage/framework/sessions
. Você pode querer alterá-lo porchmod -R 0777 storage/framework/sessions
comando. Funcionou para mimfonte
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.
fonte
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.
fonte