Laravel DecryptException - 有效负载无效

     2023-02-24     60

关键词:

【中文标题】Laravel DecryptException - 有效负载无效【英文标题】:Laravel DecryptException - The payload is invalid 【发布时间】:2017-11-22 22:43:17 【问题描述】:

我正在向我的 Laravel API 发送 AJAX 发布请求并收到此错误消息:

compiled.php 第 13235 行中的 DecryptException: 负载无效。

我正在从 cookie 中读取 XSRF-TOKEN,并将其作为名为 X-XSRF-TOKEN 的请求标头发送。

该站点与 Laravel API 完全独立,但共享相同的会话,这就是我从 cookie 获取值的原因。

奇怪的是,有时它会起作用。任何想法是什么原因造成的?

【问题讨论】:

您发送的是XSRF-TOKEN 还是X-CSRF-TOKEN 我发送一个header名字:X-XSRF-TOKEN,值取自名为XSRF-TOKEN的cookie 发送X-CSRF-TOKEN 标头。 XSRF-TOKEN cookie 未加密,但 laravel 期望 X-XSRF-TOKEN 标头被加密。 查看这篇可能对您有帮助的帖子***.com/questions/42408177/… 文档说明了这一点:Laravel 还将 CSRF 令牌存储在 XSRF-TOKEN cookie 中。您可以使用 cookie 值来设置 X-XSRF-TOKEN 请求标头。一些 JavaScript 框架,例如 Angular,会自动为您执行此操作。 - 这正是我正在做的事情。 【参考方案1】:

如果您从 JavaScript 发送 X-XSRF-TOKEN,您可以使用 decodeURIComponent() 对其进行解码。它将%3D 转换为=

【讨论】:

我用过:document.cookie.split('XSRF-TOKEN=').join('').split('%3D').join('') 是的,这可行,但并非在所有情况下。最好使用decodeURIComponent()【参考方案2】:

我找到了问题的原因。 XSRF-TOKEN cookie 值有时会在末尾附加一个恶意字符:'%3D' - 有时最后会有两个。不知道他们是如何到达那里的,但是当他们出现时,验证失败。

如果你对 cookie 值进行 base64_decode,你会得到一个 json 字符串,它的末尾附加了流氓字符:'7',因此 Laravel 的解密方法失败。

我最终不得不编写自己的 CSRF 验证函数:

$payload = base64_decode($request->header('X-XSRF-TOKEN'));

            //Remove any rogue chars from the end of the json  
            for($i=0; $i<strlen($payload); $i++)
                $lastChar = substr($payload, -1);
                if($lastChar != '')
                    $payload = substr($payload, 0, -1);
                 else 
                    break;
                
            

            //Needs to be base64 encoded when passed to decrypt
            $payload = base64_encode($payload);

            $headerToken = decrypt($payload);
            $cookieToken = $request->cookie('XSRF-TOKEN');

            //Compare tokens
            if($headerToken == $cookieToken)
                return true;
             else 
                return false;
            

【讨论】:

我还在 XSRF-TOKEN cookie 值的末尾附加了这个奇怪的字符。谁知道是什么原因造成的? 我认为为 url 编码 cookie 只是默认的浏览器行为。问题是 laravel 没有预先对其进行 urldecoding 因此,我建议您在 server.php 顶部添加 $_COOKIE = array_map('urldecode', $_COOKIE);【参考方案3】:

我遇到了同样的问题,这确实是由于 cookie 是 url 编码的,而 laravel 没有正确解码

你可以在解密前通过url解码cookie来解决

app/Http/Middleware/EncryptCookies.php

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware 
   /**
     * Decrypt the given cookie and return the value.
     *
     * @param  string  $name
     * @param  string|array  $cookie
     * @return string|array
     */
    protected function decryptCookie($name, $cookie)
    
        return is_array($cookie)
                        ? $this->decryptArray($cookie)
                        : $this->encrypter->decrypt(urldecode($cookie), static::serialized($name));
    

确保您在app/Http/Kernel.php 中使用了正确的中间件,您应该寻找EncryptCookies 并将其替换为新类

例如:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
    //...

【讨论】:

【参考方案4】:

它也可能由于加密/解密错误而发生,其中来自数据库的纯文本被解密方法/函数解密,因为您会将一些数据直接添加到数据库中,这些数据需要加密机器人作为纯文本插入,所以它可能与加密/解密问题有关。

【讨论】:

【参考方案5】:

我遇到了类似的问题,但似乎只与 Google Chrome 有关。每当遇到解密异常时,我都会将 EncryptCookies 修改为 dd():

protected function decrypt(Request $request)

    foreach ($request->cookies as $key => $c) 
        if ($this->isDisabled($key)) 
            continue;
        

        try 
            $request->cookies->set($key, $this->decryptCookie($c));
         catch (DecryptException $e) 
            dd('exception: ', $e, $key, $c, $request); // added by me
            $request->cookies->set($key, null);
        
    

    return $request;

奇怪的是,每当我刷新页面时,有时会抛出 DecryptException,但大多数时候 try 语句都会成功。当我在 IE 和 Firefox 中测试时,try 语句总是成功。这似乎与我的请求标头中的数据量有关,但问题是不确定的。

【讨论】:

嗨,我正在使用 Mozilla 浏览器,但仍然遇到同样的问题,有什么帮助吗?? 不幸的是我从来没有解决这个问题。我遇到了与 ezero 提到的流氓角色最后出现的问题相同的问题。这似乎与请求标头中的数据量有关。 我同意 chrome 似乎会在超过 2Kb 时对 cookie 进行 urlencode【参考方案6】:

这是在 Laravel 中对我有用的解决方案和步骤:

    将 CSRF 令牌作为名为 csrf-token 的元标记包含在文档的标题中:

<!-- CSRF Token -->
 <meta name="csrf-token" content=" csrf_token() ">
    创建一个 JavaScript 函数来检索 csrf-token 元标记的值:

function csrf(name="csrf-token")
    const metas = document.getElementsByTagName('meta');
    for (let i = 0; i < metas.length; i++) 
        if (metas[i].getAttribute('name') === name) 
            return metas[i].getAttribute('content');
        
    
    
    return null;
    为您的请求设置 X-CSRF-TOKEN 标头,为其指定 csrf() 函数的值。使用 Fetch API 的示例:

let params = headers:;
params.headers["Content-Type"] = "application/json; charset=UTF-8";
params.headers["X-CSRF-TOKEN"] = csrf(); // call your csrf() function
params.mode = "same-origin";
params.method = "POST";
let response = await fetch('/your-url', params);
// handle the response object

【讨论】:

问题明确指出前端与 Laravel API 后端完全分离,因此他们不能使用 csrf_token() 【参考方案7】:

+1 Tofandel 的回答,我删除了'XSRF-TOKEN' cookie 的加密。

app/Http/Middleware/EncryptCookies.php 中添加:

protected $except = [
   'XSRF-TOKEN',
];

【讨论】:

使用 laravel 安装程序创建 laravel 项目

】使用laravel安装程序创建laravel项目【英文标题】:createlaravelprojectwithlaravelinstaller【发布时间】:2016-08-2722:00:21【问题描述】:我是laravel框架的新手,经过一番搜索后我决定使用laravel5.1我阅读了官方文档并设置了环境,也安装... 查看详情

laravel 安装失败

】laravel安装失败【英文标题】:Failedtoinstalllaravel【发布时间】:2018-03-0208:25:04【问题描述】:我在VisualStudio代码中安装了composer的laravel框架。作曲家创建项目laravel/laravelems但它未能安装laravel。这是消息$作曲家创建项目laravel/lar... 查看详情

Laravel “davibennun/laravel-push-notification”

】Laravel“davibennun/laravel-push-notification”【英文标题】:Laravel"davibennun/laravel-push-notification"【发布时间】:2015-04-0213:03:55【问题描述】:我在laravel框架中使用davibennun/laravel-push-notification进行推送通知,它在向单个设备id发... 查看详情

找不到稳定性稳定的包 /laravel/laravel

】找不到稳定性稳定的包/laravel/laravel【英文标题】:Couldnotfindpackage/laravel/laravelwithstabilitystable【发布时间】:2017-05-1123:57:32【问题描述】:Couldnotfindpackage/laravel/laravelwithstabilitystable.所以当我尝试使用以下命令创建新的laravel项目... 查看详情

laravel中使用的pdf扩展包——laravel-dompdf和laravel-snappy

...为PDF文件方便打印,我在网上搜了很多资料。先后尝试了laravel-dompdf和laravel-snappy两种扩展包,个人感觉laravel-snappy比较好用。  一、使用laravel-dompdf扩展包1、安装扩展包我们通过composer来安装composerrequirebarryvdh/laravel-dompdf&n... 查看详情

如何搭建一个laravel项目

1、安装 Laravel我介绍两种方式通过Laravel安装器Laravel使用Composer 管理依赖,因此,使用Laravel之前,确保机器上已经安装了Composer。首先,通过Composer安装Laravel安装器: composerglobalrequire"laravel/installer" 安装完成后,... 查看详情

Laravel jordanmiguel/laravel-流行错误[重复]

】Laraveljordanmiguel/laravel-流行错误[重复]【英文标题】:Laraveljordanmiguel/laravel-popularerror[duplicate]【发布时间】:2018-07-0902:31:04【问题描述】:我正在使用Laravel/popular,当我添加3个类并进行迁移时,它给了我错误。这里列出了3个类... 查看详情

安装 Laravel 后出现“laravel:找不到命令”

】安装Laravel后出现“laravel:找不到命令”【英文标题】:"laravel:commandnotfound"afterinstallingLaravel【发布时间】:2020-09-1923:39:02【问题描述】:使用后composerglobalrequirelaravel/installer看来安装成功了。第二次,结果是:Changedcurr... 查看详情

laravel服务容器

 laravel框架底层解析本文参考陈昊《Laravel框架关键技术解析》,搭建一个属于自己的简化版服务容器。其中涉及到反射、自动加载,还是需要去了解一下。laravel服务容器建立项目空文件夹(如mylaravel)添加composer.json,执行co... 查看详情

Laravel + React,使用 Laravel 身份验证的 api

】Laravel+React,使用Laravel身份验证的api【英文标题】:Laravel+React,consumeapiwithLaravelauthentication【发布时间】:2019-03-1522:07:59【问题描述】:我们有一个以react作为前端的Laravel项目。react基本上是在laravel项目里面,我们用phpartisanprese... 查看详情

Laravel 路由模型绑定 - Laravel 5.7

】Laravel路由模型绑定-Laravel5.7【英文标题】:LaravelRouteModelBinding-Laravel5.7【发布时间】:2021-05-2423:34:24【问题描述】:我正在尝试使用Laravel的路由模型绑定。我在RoutesServiceProvider中设置了一个绑定来执行一些自定义解析逻辑。这... 查看详情

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

】Laravel图像规则验证不适用于Laravel8,但适用于Laravel7|拉拉维尔|图片|验证【英文标题】:LaravelimagerulevalidationisnotworkingforLaravel8butwasworkingforLaravel7|Laravel|Image|Validation【发布时间】:2021-07-1916:30:56【问题描述】:我正在开发一个... 查看详情

在 Laravel 8 中安装 Laravel/ui 的问题

】在Laravel8中安装Laravel/ui的问题【英文标题】:ProblemwithinstallingLaravel/uiinLaravel8【发布时间】:2021-04-0309:25:56【问题描述】:我正在尝试安装laravel/ui,但出现此错误:**Problem1**-laravel/tinkerislockedtoversionv2.5.0andanupdateofthispackagewasnotr... 查看详情

Laravel 5.5:laravel.log 无法打开:权限被拒绝

】Laravel5.5:laravel.log无法打开:权限被拒绝【英文标题】:Laravel5.5:laravel.logcouldnotbeopened:Permissiondenied【发布时间】:2018-09-1404:45:18【问题描述】:我正在尝试在我的ElasticBeanstalk实例上运行一个简单的Laravel命令行:phpartisanqueue:wo... 查看详情

laravel完整开源项目大全

http://laravelacademy.org/laravel-project原型项目Laravel5Boilerplate —— 基于当前Laravel最新版本(Laravel5.1.*)并集成Boilerplate的项目Laravel5AngularMaterialStarter —— 这是一个Laravel5.1和AngularJS的原型项目Som 查看详情

在 Ubuntu 中安装 Laravel 5:找不到 laravel 命令 [重复]

】在Ubuntu中安装Laravel5:找不到laravel命令[重复]【英文标题】:Laravel5InstallationinUbuntu:laravelcommandnotfound[duplicate]【发布时间】:2015-04-2006:46:53【问题描述】:当我尝试在ubuntu中安装laravel5时,出现这样的错误,laravel:commandnotfound我... 查看详情

向军laravel和vuejswebapp实战开发

1向军laravel开发宝典-git库与开发环境及工具软件介绍.mp42向军laravel开发宝典-安装laravel框架.mp43向军老师laravel开发宝典-安装laravel-ide-helper增强代码提示.mp44向军老师laravel开发宝典-配置数据库与使用migrations创建表.mp45向军老师larav... 查看详情

如何将 App\Exceptions 从 laravel 7 升级到 laravel 8

】如何将App\\\\Exceptions从laravel7升级到laravel8【英文标题】:HowtoupgradeApp\\Exceptionsfromlaravel7tolaravel8如何将App\\Exceptions从laravel7升级到laravel8【发布时间】:2021-10-0920:24:08【问题描述】:如何升级App\\Exceptions;从laravel7到laravel8publicfun... 查看详情