web-dev-qa-db-fra.com

Laravel DecryptException - La charge utile n'est pas valide

J'envoie une AJAX demande de publication à mon Laravel API et je reçois ce message d'erreur:

DecryptException dans la ligne compilée.php 13235: la charge utile n'est pas valide.

Je lis le XSRF-TOKEN à partir du cookie et l'envoie avec un en-tête de demande nommé X-XSRF-TOKEN.

Le site est un site complètement séparé de l'API Laravel mais partage la même session, c'est pourquoi j'obtiens la valeur d'un cookie.

Ce qui est étrange, c'est que parfois ça marche. Des idées ce qui cause cela?

5
ezero

Si vous envoyez X-XSRF-TOKEN À partir de JavaScript, vous pouvez le décoder à l'aide de decodeURIComponent(). Il convertit %3D En =.

9
VnoitKumar

J'ai découvert la cause du problème. La valeur du cookie XSRF-TOKEN avait parfois un caractère voyou ajouté à la fin: '% 3D' - parfois il y en a deux à la fin. Je ne sais pas comment ils y arrivent, mais lorsqu'ils sont présents, la vérification échoue.

Si vous base64_decode la valeur du cookie, vous obtenez une chaîne json qui a le caractère escroc: '7' ajouté à la fin de sorte que la méthode de déchiffrement de Laravel échoue.

J'ai fini par devoir écrire ma propre fonction de vérification 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;
            }
5
ezero

J'ai eu un problème similaire, mais il semble être lié uniquement à Google Chrome. J'ai modifié EncryptCookies en dd () chaque fois qu'il rencontrait une exception de déchiffrement:

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;
}

Étrangement, chaque fois que je rafraîchis la page, parfois DecryptException est levée mais la plupart du temps, l'instruction try réussit. Lorsque je teste dans IE et Firefox, l'instruction try réussit toujours. Elle semble liée à la quantité de données dans mes en-têtes de demande, mais le problème n'est pas déterministe.

0
Andy White

cela peut également se produire en raison d'une erreur de chiffrement/déchiffrement, où le texte brut de la base de données a été déchiffré par la méthode/fonction de déchiffrement, car vous auriez ajouté des données directement dans la base de données qui doivent être chiffrées, le robot inséré en texte clair, afin qu'il puisse être lié à un problème de cryptage/décryptage.

0
user9220465