web-dev-qa-db-fra.com

unserialize (): erreur au décalage de 40 octets

Je veux exécuter mon application dans localhost avec php artisan serve mais je reçois cette erreur unserialize(): Error at offset 0 of 40 bytes où est mon problème?

20
Hanie Asemi

La même erreur s'est produite lorsque j'ai mis à niveau une application Laravel 5.5 vers la version 5.6. L'erreur provient de la EncryptCookies- Middleware.

Supprimez les cookies de votre navigateur et/ou effacez vos fichiers de session dans votre application Laravel.

33
stefanzweifel

Vous devez définir une nouvelle clé Generate car 

php artisan key:generate

Après ce test à nouveau pour exécuter l'application Laravel

php artisan serve
35
Yann Assoumou

J'ai eu la même erreur il y a quelques jours lorsque j'ai envoyé une mise à jour de la production de mon projet Laravel de Envoyer .

Correctif immédiat: J'ai essayé de revenir au commit précédent, mais le problème persistait, ce qui signifie que le problème provenait du côté client, probablement des cookies. J'ai essayé de supprimer les cookies et le problème avait disparu.

Plus tard, j'ai passé beaucoup de temps à rechercher ce problème mais je n'ai rien eu jusqu'à ce que je sois confronté à ce problème aujourd'hui avec un autre déploiement et que j'ai trouvé cet article sur Nouvelles de Laravel sur le correctif de sécurité 5.6.30 mise à jour. J'ai pu identifier que ce problème se produisait si j'essayais de déployer la version précédente (<5.6.30) de laravel v5.6.26 pour un projet qui utilisait déjà> v5.6.30 et que des cookies étaient déjà créés (non validés), lesquels <5.6.30 La version de la structure tente de dissocier les résultats, car ils ne sont pas correctement rendus compatibles. 

  • Installation de laravel/framework (v5.6.26) Chargement à partir du cache

À partir du guide de mise à niveau:

Configuration de la sérialisation des cookies Étant donné que cette vulnérabilité n’est pas possible à exploiter sans accès à la clé de chiffrement de votre application, nous avons choisi de fournir un moyen de réactiver le cookie crypté la sérialisation tout en rendant votre application compatible avec ceux-ci changements. Pour activer/désactiver la sérialisation des cookies, vous pouvez modifier le Propriété static serialize de App\Http\Middleware\EncryptCookies middleware:

J'ai pu résoudre ce problème de façon permanente en effaçant le cache du composeur, le forçant ainsi à charger la dernière version du framework au lieu de revenir en cache.

J'espère que cela t'aides.

Bests, 

3
qadeerkhan

J'ai rencontré le même problème. J'ai souvent fait face à ce problème dans un environnement homestead-vagrant ... Pour résoudre ce problème dans Laravel 5.4.5.5.5.6 ou plus -

php artisan config: effacer

vue artisan php: effacer

clé artisan php: générer

2
Asad Zaman

Dans mon cas, j'ai retiré mon composer.lock et fait un composer install et le tour est joué ...

$ cd project_root
$ rm composer.lock
$ composer install
2
Shobi

Il suffit d'inspecter l'élément dans le navigateur, d'aller à l'onglet Application, de sélectionner le cookie et de le supprimer. C'est tout.

 enter image description here

2
Bomjon Bedu

Dans App\Exceptions\Handler sous la fonction de rendu, utilisez cet extrait, il réinitialisera le cookie du navigateur.

if (str_contains($exception->getMessage(), 'unserialize')) {
    $cookie1 = \Cookie::forget('laravel_session');
    $cookie2 = \Cookie::forget('XSRF-TOKEN');

    return redirect()->to('/')
                 ->withCookie($cookie1)
                 ->withCookie($cookie2);
}
1

J'ai également rencontré ce problème lorsque j'ai mis à jour mon compositeur. Si vous mettez 

protected static $serialize = true;

dans App\Http\Middleware\EncryptCookies, l'ancien cookie endommagera votre système. Donc, pour éviter cela, vous devez soit effacer le cookie, soit simplement ne pas désérialiser le cookie déchiffré. .php Au-dessus de cette ligne de la fonction decrypt ():

return $unserialize ? unserialize($decrypted) : $decrypted;

ajouter:

try {
            $workaround = unserialize($decrypted);
            return $unserialize ? unserialize($decrypted) : $decrypted;
        } catch (\Exception $e){
            return $decrypted;
        }

C'est peut-être moche, mais vous pouvez y mettre temporairement jusqu'à ce que vous pensiez que les anciens cookies sont partis.

0
Nghia Le