【发布时间】:2019-09-29 10:05:50
【问题描述】:
这是我遇到的 419 错误的模式
- 登录应用程序
- 注销
- 再次登录
- 再次登出出现419错误
登录后,当我点击任何链接(调用路由)时,发生 419,尤其是当我尝试删除任何记录时,会出现此错误,根据我在此错误期间的发现,我意识到会话中的每个表单提交令牌存储已更新,但在表单提交请求中作为隐藏字段传递的令牌未更新,这是导致令牌不匹配的原因
我做了什么来解决这个问题?
目前我正在使用 laravel 5.7.28 版本,我尝试在其他共享主机应用程序上使用相同的应用程序工作正常。
我只在 GoDaddy 主机上遇到 419
以下是我解决问题但没有取得丰硕成果的步骤
1.
我注释掉
// \App\Http\Middleware\VerifyCsrfToken::class,
从 kernel.php 419 错误消失,但是通过在登录后单击任何我在登录屏幕上重定向的链接时执行此操作意味着会话被破坏
2.
我也重新生成了应用密钥
APP_KEY=base64:8NYbcWPkEaj5oVHEGBWxCaFVHQhkgA/OOZyFPBiDMYQ=
3.
在 session.php 文件中
'http_only' => false,
4.
会话在 storage/framework/session.php 中正确记录,我分配权限 777
5.
在此处输入代码
然后我尝试手动调试会话
vendor/laravel/framework/src/Illuminate\Foundation\Http\Middleware
public function handle($request, Closure $next)
{
echo "<pre>";
print_r($this->getTokenFromRequest($request));
echo "</pre>";
echo "<pre>";
print_r($request->session()->token());
echo "</pre>";
die()
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->inExceptArray($request) ||
$this->tokensMatch($request)
) {
return tap($next($request), function ($response) use
($request) {
if ($this->shouldAddXsrfTokenCookie()) {
$this->addCookieToResponse($request, $response);
}
});
}
throw new TokenMismatchException;
}
csrf 令牌存储在会话中并在每次提交表单时更新
$request->session()->token();
但表单提交中的令牌存储 $request 保持不变/静态不会更改/更新
$this->getTokenFromRequest($request);
这实际上是令牌不匹配的原因,它以错误 419 的形式引发异常
6.
在每个表单上正确使用@scrf 令牌,我还替换了 {{csrf_filed() }}
7.
同时运行 composer update 命令
8.
在不同的浏览器上运行应用程序
9.
注释掉
//\App\Http\Middleware\VerifyCsrfToken::class in \app\Http\Kernel.php
当我提交上面的文件 419 消失但当我点击任何链接会话被破坏时,注销并返回登录页面 注释掉
//\Illuminate\Session\Middleware\AuthenticateSession::class
在
\app\Http\Kernel.php
.env 文件代码
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:8NYbcWPkEaj5oVHEGBWxCaFVsQhkgA/OOZyFPBiDMYQ=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ltcsar
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379+
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
【问题讨论】:
标签: php laravel security web web-hosting