PHP - deserializace objektu - ošetření vstupu

PHP - deserializace objektu - ošetření vstupu
« kdy: 08. 08. 2021, 12:06:42 »
Pomoci sha1 a serialize vytvarim hash instance objektu User.
Instance objektu je ulozena v COOKIE pomoci base64_encode.
Pomoci
Kód: [Vybrat]
unserialize(base64_decode($_COOKIE['user']),["allowed_classes" => ["User"]]); ; ziskavam objekt zpet a kontroluji jeho integritu znovu pomoci sha1 serialize.
Cetl jsem par clanku a ocividne to neni bezpecne, protoze deserialize methoda je snadno napadnutelna.
Muzu nejak vic ochranit unserialize metodu?
« Poslední změna: 08. 08. 2021, 12:09:20 od vesterna12 »


tecka

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #1 kdy: 08. 08. 2021, 12:16:41 »
Pravděpodobně serializaci nepotřebuješ a stoprocentně ne na data v cookies. Tak to prostě nedělej.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #2 kdy: 08. 08. 2021, 12:24:11 »
Potřebuji předat instanci objektu do COOKIE, ale nevím jak to udělat jinak.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #3 kdy: 08. 08. 2021, 12:39:08 »
COOKIE má omezenou velikost, buď uložit do persistentního storage v browseru anebo si do cookie uložit jen identifikátor objektu a uložit si to na serveru anebo použít session, kde to již vše víceméně vyřešené. Nejlépe si o tom něco přečíst, je tam totiž více různých úskalí.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #4 kdy: 08. 08. 2021, 12:47:48 »
Není mi jasné, jak tam pracujete s tím hashem. Pokud znáte hash serializovaných dat, můžete nejprve ověřit hash a pak až deserializovat – tím máte zaručeno, že nemohl nikdo serializovaná data podvrhnout.

Pro serializaci krátkých dat posílaných mezi prohlížečem a serverem se dnes obvykle používá JSON Web Token.

Každopádně ale to, o co se pokoušíte, je celé divné. Lepší by bylo, kdybyste popsal, jaký problém řešíte. Nejspíš už to řešily tisíce lidí před vámi a existuje na to nějaké ověřené řešení, možná dokonce standard.


Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #5 kdy: 08. 08. 2021, 13:09:31 »
Pokud znáte hash serializovaných dat
Tím bylo samozřejmě myšleno, že zároveň uživatel nemůže správný hash podvrhnout. Tj. buď je hash uložený jenom na serveru, nebo se sice bere hash od uživatele, ale je to hash vytvořený z dat a z tajemství, které uživatel nezná.

Kit

  • *****
  • 644
    • Zobrazit profil
    • E-mail
Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #6 kdy: 08. 08. 2021, 13:18:25 »
Nebylo by jednodušší použít session, kde je tohle vše již vyřešeno včetně hashe?

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #7 kdy: 08. 08. 2021, 13:24:57 »
Chtěl jsem se vyhnout replikaci relací.
Uživatel měl předložit podepsanou instanci objektu, která obsahuje info o autorizaci a autentizaci.
Teď jsem si na tom pěkně vylámal zuby.
Buď budu muset nastavit replikaci nebo objekty ukládat do db a získávat je zpět pomocí id uloženého v cookie...

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #8 kdy: 08. 08. 2021, 15:17:25 »
Uživatel měl předložit podepsanou instanci objektu, která obsahuje info o autorizaci a autentizaci.
To zní přesně jako JSON Web Token.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #9 kdy: 09. 08. 2021, 09:58:13 »
Na co presne tady nestaci PHP session (a pripadne jeji ukladani do memcache pokud je vice PHP serveru na backendu)? Stejne by tam melo byt jen user id a cely objekt inicializovat jako entitu (a je jedno jestli z DB nebo nejake cache layer)
Děkuji za možnost editace příspěvku.

RDa

  • *****
  • 1 482
    • Zobrazit profil
    • E-mail
Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #10 kdy: 09. 08. 2021, 10:45:02 »
Cetl jsem par clanku a ocividne to neni bezpecne, protoze deserialize methoda je snadno napadnutelna.
Muzu nejak vic ochranit unserialize metodu?

Podivejte se na ten serializovany format - a napiste si REGEX ktery to velice striktne matchne od ^ po $. Snad vite kde v objektech mate cisla a pismenka.. ponekud horsi to bude jestli tam chcete prenaset binarky nebo UTF.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #11 kdy: 09. 08. 2021, 11:33:54 »
Na co presne tady nestaci PHP session (a pripadne jeji ukladani do memcache pokud je vice PHP serveru na backendu)? Stejne by tam melo byt jen user id a cely objekt inicializovat jako entitu (a je jedno jestli z DB nebo nejake cache layer)
Proč tam zavádět memcache, pokud se jinak nepoužívá? Proč zavádět centrální bod, na kterém bude záviset vše a který bude úzkým hrdlem při škálování aplikace?

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #12 kdy: 09. 08. 2021, 11:36:27 »
Podivejte se na ten serializovany format - a napiste si REGEX ktery to velice striktne matchne od ^ po $. Snad vite kde v objektech mate cisla a pismenka.. ponekud horsi to bude jestli tam chcete prenaset binarky nebo UTF.
Takového řešení bych se dost bál. Jednak že stejně nepodchytíte nějakou možnost, jak tam útočník propašuje něco škodlivého. Jednak že se formát serializace změní. Je vůbec v PHP při serializaci zaručeno, že bude pořadí prvků stále stejné? Já pro takovou záruku nevidím žádný důvod.

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #13 kdy: 09. 08. 2021, 11:44:13 »
Proste pouzit redis backend pre session. Je jedno ci ide o maly projekt kde bude jedna redis node, alebo velky projekt kde bude cluster n redis node... Tie php containery sa tym stanu bezstavove. Len sa ta stavovost neprenesie do browseru uzivatela, ale tam kam patri. To o co sa znazite vy, na tom si vylamalo zuby uz mnoho vyvojarov. Nie vsetko co najdete na webe je navod ale skor varovanie...

Re:PHP - deserializace objektu - ošetření vstupu
« Odpověď #14 kdy: 09. 08. 2021, 11:54:59 »
Jednak že se formát serializace změní. Je vůbec v PHP při serializaci zaručeno, že bude pořadí prvků stále stejné? Já pro takovou záruku nevidím žádný důvod.

No, ona ta zaruka tam nie je. Php ma tych serializatorov niekolko. Da sa to pouzit iba pre session alebo pre cache, ci ine co nevadi ak po restarte servra zmizne. Videl som uz x projektov, ktore technologicky zamrzli koli tomu, ze nejakeho sialenca napadlo ukladat serializovane objekty do databazy.