abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 6
    včera 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 9
    včera 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 36
    25.4. 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 13
    25.4. 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 3
    25.4. 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    25.4. 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    25.4. 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    25.4. 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    25.4. 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (74%)
     (8%)
     (2%)
     (16%)
    Celkem 823 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    PHP hádanka: chýbajúce dáta v $_POST

    5.4.2023 14:30 | Přečteno: 851× | programovanie | poslední úprava: 6.4.2023 07:35

    V dnešnej hádanke sa pozrieme na jednu vlastnosť spracovania POST v jazyku PHP.

    Majme HTML formulár s niekoľkými inputmi:

    <form action="/uloz.php" method="post" enctype="multipart/form-data">
      Správa: <textarea name="sprava"></textarea><br />
      Príloha: <input type="file" name="subor" /><br />
      <input type="hidden" name="vec_id" value="1234" />
      <input type="submit" value="Odoslať" />
    </form>

    Formulár sa metódou POST odosiela na server, kde ho PHP skript bez veľkých zmien uloží do databázy:

    <?php
    $zaznam_id=uloz_zaznam(array(
      "vec_id"=>(int)$_POST["vec_id"],
      "sprava"=>$_POST["sprava"],
    ));
    uloz_prilohu($zaznam_id,$_FILES["subor"]);

    Napriek tomu, že vec_id vo formulári je vždy predvyplnené správnym a validným číslom a používateľ ho nemá ako zmeniť, občas uloženie záznamu neprebehne:

    INSERT INTO zaznamy (vec_id,sprava) VALUES (0,'Hotovo');
    ERROR: insert or update on table "zaznamy" violates foreign key constraint "zaznamy_vec_id_fkey"
    DETAIL: Key (vec_id)=(0) is not present in table "veci".
    

    Udeje sa teda to, že hodnota poľa vec_id niekde po ceste zmizne a formulár sa neuloží.

    Kto prvý príde na to, čo sa tam naozaj deje? Nám to trvalo len desať rokov...

     

     

     

    Update 6.4.2023 - doplnené hinty a riešenie:

     

     

     

    Hint č.1

    Keď si na začiatku toho PHP skriptu nechám zalogovať $_POST, niekedy tam je len toto:

    array(1) {
      ["sprava"]=>
      string(5) "blaaa"
    }

    (tzn. vec_id sa tam vôbec nenachádza)

     

     

     

    Hint č.2

    Ak nechám zalogovať aj $_FILES, v prípade chyby je tam vždy toto:

    array(1) {
      ["subor"]=>
      array(6) {
        ["name"]=>
        string(11) "priloha.pdf"
        ["full_path"]=>
        string(11) "priloha.pdf"
        ["type"]=>
        string(0) ""
        ["tmp_name"]=>
        string(0) ""
        ["error"]=>
        int(3)
        ["size"]=>
        int(0)
      }
    }

    Dokumentácia k chybe uploadu číslo 3

     

     

     

    Riešenie

    Stane sa to, že sa upload preruší a PHP sa spustí nad nekompletnými dátami. Keďže parameter sprava ide ako prvý, ten prejde. Druhý parameter je upload súboru - ten je obvykle dlhší a dáva najviac priestoru na to, aby počas jeho prenosu došlo k ukončeniu spojenia. A skrytý parameter, ktorý má súbor zviazať s konkrétnym id v tabuľke (vec_id), sa pri prerušení spojenia už jednoducho neodošle.

    Ako sa preruší spojenie?

    Veľmi jednoducho - používateľ počas odosielania klikne niekam inam, prehliadač odosielanie zastaví a začne novú požiadavku. Alebo - a to je extra chrumkavé - nedočkavý používateľ znova klikne na tlačidlo "Odoslať". Tým sa prebiehajúci upload zastaví a začne odznova. To vysvetľuje, prečo sa pri skúmaní bugu zdalo, že uloženie prebehlo úspešne napriek chybe v logu. Uloženie naozaj prebehlo úspešne, ale na druhý pokus.

    Čo proti tomu nepomáha?

    Ako proti tomu bojovať?

    Víťaz

    Nakoniec sa k riešeniu najbližšie dostal mirec (tu). Budem ho kontaktovať ohľadom vecnej ceny.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    5.4.2023 14:57 Jdhdbf
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Race condition. Mate pouzivat autoincrement.
    AraxoN avatar 5.4.2023 15:10 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Nie, toto nesúvisí ani s autoincrementom, ani s race condition. Vec_id odkazuje na existujúci záznam v inej tabuľke. Vo formulári (v prehliadači) je v momente odoslania správna hodnota. Ale PHP na serveri túto hodnotu v malom percente prípadov neuvidí.
    5.4.2023 15:27 Petr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Pak nam asi nerikas vsechno. Mas spatny data v databazi? Protoze si nedokazu predstavit ze to jednou za cas nezafunguje pokud se to na server posila spravne a nejedna se o race condition.
    AraxoN avatar 5.4.2023 16:34 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Toto nie je poradňa, ale blog. Chyba už bola nájdená, ale je to taký pekný špek v PHP, že som o tom musel napísať blog. Budem tu postupne dávať viac hintov, ale s databázou to vonkoncom nesúvisí. Databáza je len tá časť systému, ktorá hlásila chybu, čo aj nás dlho vodilo za nos.
    5.4.2023 16:06 Petr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Posli db schema. Mozna int vs kdovijaky typ mas v db. Pak by to zlobilo pro cisla co se nevlezou do intu.
    AraxoN avatar 5.4.2023 16:46 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Tu to je, ale opakujem, že chyba nie je v SQL ani v databáze.
    CREATE TABLE veci (
      id SERIAL NOT NULL,
      nazov VARCHAR NOT NULL,
      ...
      PRIMARY KEY (id)
    );
    INSERT INTO veci (id, nazov) VALUES (1234, 'Divná chyba');
    
    CREATE TABLE zaznamy (
      id SERIAL NOT NULL,
      vec_id INT NOT NULL REFERENCES veci (id) ON UPDATE CASCADE ON DELETE CASCADE,
      sprava TEXT NOT NULL,
      ...
      PRIMARY KEY (id)
    );
    CREATE INDEX zaznamy_vec_id ON zaznamy (vec_id);
    
    CREATE TABLE zaznam_prilohy (
      id SERIAL NOT NULL,
      zaznam_id INT NOT NULL REFERENCES zaznamy (id) ON UPDATE CASCADE ON DELETE RESTRICT,
      nazov VARCHAR NOT NULL,
      cesta VARCHAR NOT NULL,
      ...
      PRIMARY KEY (id)
    );
    CREATE INDEX zaznam_prilohy_zaznam_id ON zaznam_prilohy (zaznam_id);
    
    5.4.2023 16:45 Ragzid | skóre: 24 | blog: Pivní koutek | Liberec-Brno
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Pokud je vec_id=0, tak to (predevsim u autoincrementu) ulozi realne jinou hodnotu.

    Jinak je tu prilis malo informaci, priklad je tak genericky, ze muzeme pouze hadat.
    AraxoN avatar 5.4.2023 16:48 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    vec_id=0 posiela do databázy ten PHP skript

    mal by ale posielať vec_id=1234, tak ako to je vo formulári, z ktorého čerpá dáta
    5.4.2023 16:58 Ragzid | skóre: 24 | blog: Pivní koutek | Liberec-Brno
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Aha, takze popis problemu by mel byt: Proc se v $_POST["vec_id"] vraci prazdno, coz se pretypuje diky (int) na nulu?

    Nicmene netusim, podeziram spis skript, co generuje HTML, ze uz tam ulozi spatnou hodnotu. Pripadne se tam deji s _POST jeste jine operace, o kterych my ctenari nevime.
    5.4.2023 17:35 Hsjdhd
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Dalsi moznost by byla ze to uzivatel zmeni (f12, proxy, ...) aby mel op nad cim premyslet. Ale jo, tech duvpdu muze byt celkem dost, od velikosti post requestu, nejaky obskurni nastaveni v php.ini atd.
    5.4.2023 16:57 Petr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Tak nejak. Tech moznosti muze byt hromada. Jen google vraci asi 5 zakladnich duvodu pro tohle chovani. Pockame az op sesedne z kone povysenosti "vim vic nez vy vsichni" a doda nejaky relevantni info.
    6.4.2023 03:14 J
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    +100
    mirec avatar 5.4.2023 17:36 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Škoda, že neviem čo obsahuje $_POST["vec_id"], takže neviem, či obsahuje garbage, je truncted, alebo nie je vôbec.

    Možnosti, ktoré ma napadli:

    • PHP má rozbite parsovanie boundary (skôr nepravdepodobné keď je to označené ako vlastnosť, nie bug)
    • Nejaká exotická vlastnoť "Variables From External Sources"
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    5.4.2023 17:38 kvr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Není tam nějaké přesměrování (třeba authentication), které pošle link znovu, ale už bez dat?
    AraxoN avatar 5.4.2023 19:25 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Nie, presmerovanie tam nie je. Ani žiadna proxy. Ani mod_rewrite.
    5.4.2023 17:45 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Napriek tomu, že vec_id vo formulári je vždy predvyplnené správnym a validným číslom a používateľ ho nemá ako zmeniť
    Jak nemá ako zmeniť? Tu hodnotu může v prohlížeči upravit (nebo poslat request jinak). Neposílá vám tam nějakej bot nějaký hovadiny?
    AraxoN avatar 5.4.2023 19:28 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Dobre, používateľ môže meniť <input type="hidden"> s pomocou developerských nástrojov v prehliadači, ale v tomto prípade ide o BFU a nerobí to. Tým to nie je.
    5.4.2023 17:52 bigfood | blog: Finesa
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Nesouvisí to náhodou s tím souborem? Že je třeba větší, než dovoluje post_max_size?
    AraxoN avatar 5.4.2023 19:34 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Toto chovanie nemá na svedomí post_max_size, upload_max_filesize, ani max_input_time.

    Takže prekročením týchto parametrov to nie je, ani prekročením iných konfiguračných hodnôt z php.ini. Ale si na dobrej ceste v tom, že to súvisí s tým uploadom súboru.
    5.4.2023 17:57 R
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Niekto tam jebne velky subor a obmedzenie na post_max_size oreze data tak, ze vec_id zmizne.
    5.4.2023 18:11 Gjhgg
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    To je jedna z prvnich veci co vyhledavac vrati, to by nezabralo 10 let. Krom toho to vypada ze druha post value je neobrezana, coz by byla haluz se zrovna tak trefit.
    AraxoN avatar 5.4.2023 19:48 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Tak, ono to tomu istému človeku s tým istým súborom na tom istom hardvéri o chvíľu už ide.

    V logu vidím, že niečo neprešlo, idem sa teda pozrieť do databázy a tam vidím, že sa mu to už podarilo uložiť. Keď nemám lepšiu prácu, tak sa v tom trochu vrtám, na nič neprídem, lebo mne to zakaždým ide, takže to zase nechám tak.

    Takto ubehnú roky - nakoniec to vždy ide, príčina ostáva neznáma. Kód je priamočiary, chyba v ňom nie je. Zvíťazia aktuálnejšie problémy, ktoré musí developer riešiť.
    AraxoN avatar 5.4.2023 19:39 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Prihorieva. Naozaj vec_id je na konci odosielaných dát a z hodnôt proste zmizne. Ale nie je to prekročením post_max_size.

    Keď si na začiatku toho PHP skriptu nechám zalogovať $_POST, niekedy tam je len toto:
    array(1) {
      ["sprava"]=>
      string(5) "blaaa"
    }
    (tzn. vec_id sa tam vôbec nenachádza)
    mirec avatar 5.4.2023 19:48 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Sekne všetko za uploadom pri chunked encodingu?

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    AraxoN avatar 5.4.2023 19:50 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Nie, tým to nie je.
    AraxoN avatar 5.4.2023 20:06 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    K riešeniu nás nakoniec doviedlo zalogovanie premennej $_FILES, čo nikoho za 10 rokov nenapadlo.

    V prípade chyby je obsah $_FILES zakaždým zhruba takýto:
    array(1) {
      ["subor"]=>
      array(6) {
        ["name"]=>
        string(11) "priloha.pdf"
        ["full_path"]=>
        string(11) "priloha.pdf"
        ["type"]=>
        string(0) ""
        ["tmp_name"]=>
        string(0) ""
        ["error"]=>
        int(3)
        ["size"]=>
        int(0)
      }
    }
    Odtiaľ už len treba dohľadať, čo znamená chyba číslo 3 a začne sa rozvidnievať...
    5.4.2023 20:13 m
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    "Kód je priamočiary, chyba v ňom nie je". Tak ocividne jo, kdyz tam chybi kontrola jestli upload probehl vpohode.
    6.4.2023 03:17 J
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Ale prosim te, bastlici a lepici v php na nejake kontroly zvysoka sekaslou…
    5.4.2023 20:18 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Přeplněné /tmp?

    Každopádně, ať už je ta chybá způsobená čímkoli, ten kód bych vyhodnotil jako nesprávný - neošetřuje chyby.
    5.4.2023 21:31 kvr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Já bych spíš jako nesprávný hodnotil ten server předtím. Neúplný request by vůbec neměl Php předat. Divné taky je, že zmizí jenom jedna hodnota - čekal bych, že půjdou všechny pohromadě v rámci jednoho www-form-urlencoded (nebo jak se to nazývá).

    Přiznám se, že teď nevím, jak by reagovala Java - podezřívám, že pokud půjde o InputStream, tak se request možná začne zpracovávat hned a až čtení z InputStream nejspíš hodí IOException. Nebo jej možná korektně nepředá vůbec...

    mirec avatar 5.4.2023 21:59 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Tá hodnota chýba pretože je v requeste za súborom, takže pri postupnom čítaní sa už na ďalší argument nedostane. V tomto prípade by request nemal byť spracovaný vôbec.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    AraxoN avatar 6.4.2023 07:01 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Bingo! V jazyku PHP nie je kontrola, či prišiel celý POST request predtým, než sa začne vykonávať. Otázka je, či je to vôbec chyba a či to iné "webové" technológie majú inak.
    6.4.2023 11:09 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Bingo! V jazyku PHP nie je kontrola, či prišiel celý POST request predtým, než sa začne vykonávať. Otázka je, či je to vôbec chyba a či to iné "webové" technológie majú inak.
    V zásadě to chyba není, ale jak říkám, tam je úplně špatně to API nad tím, kde data requestu taháš z nějakého globálního pole a musíš se dívat do nějakého jiného globálního pole, jestli tam náhodou není chyba... To je úplně blbě, správně by měl existovat nějaký objekt/struktura/whatever representující request a ten by měl zpřístupňovat různé vlastnosti, jako např. jestli request doběhl celý / nebyl přerušen a form data by zpřístupnil pouze, pokud je všechno v pořádku.

    IMO tvoje řešení v odstavci Ako proti tomu bojovať? je jenom takový hack, který neřeší podstatu problému, vůbec se mi to nelíbí, protože to zase spoléhá na nějaké řazení dat z HTML form. Je to pořadí vůbec garantované, nebo je to jenom nějaká konvence? Nehledě k tomu, že zas někdo může poslat request bez toho posledního políčka. Na to bych vůbec takhle nespoléhal. Měl bys IMO primárně především na začátku zkontrolovat proměnnou $_FILES jestli tam není ta chyba. Ideálně bys měl napsat nějakou funkci nebo request API, které tuhle křehkou práci zabalí na jednom místě a poskytne bezpečné, chybově ošetřené API, k tomu případně připsat pořádně velký a strašidelný komentář varující člověka, aby si dobře rozmyslel změny v té funkci/API, protože jsou z toho pak tyhle blbě debugovatelný problémy.

    A ve zbytku kódu už bys používal jen tuhle funkci/API a na ty debilní globální proměnný vůbec nešahal.
    6.4.2023 12:09 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Nehledě k tomu, že zas někdo může poslat request bez toho posledního políčka.
    Oprava: Měl jsem na mysli, že může to pořadí přehodit.
    6.4.2023 22:17 Václav HFechs Švirga | skóre: 26 | blog: HF | Kopřivnice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Např. https://doc.nette.org/en/forms/standalone (samostatně se dá použít, je to jeden PHP soubor tuším, řeší toho spousty).
    Baník pyčo!
    mirec avatar 5.4.2023 20:38 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Jaj prerušený upload

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    mirec avatar 5.4.2023 20:48 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Inak sranda bola aj debugovanie password_verify keď pri zlom vstupe vracia true.

    The documentation for `password_verify()` clearly states that the `$hash` has to be valid:
    > hash
    > A hash created by password_hash().
    I fail to see how this is a bug if you feed it garbage; also the documentation to crypt states:

    Crypt je inak tiež krásny modul ;)

    Returns the hashed string or a string that is shorter than 13 characters and is guaranteed to differ from the salt on failure.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    5.4.2023 21:37 kvr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Ta password_verify je teda masakr. A ta argumentace v tom ticketu ještě horší.

    Ono Php je celkově slepá větev. Kdysi jsem řešil, že nějaká string funkce (substr?) při očekávaném výsledku prázdného stringu vracela false. Následně porovnání přes === samozřejmě selhalo. Ten jazyk a API jsou tak špatné, že není jiné cesty než zahodit.
    5.4.2023 22:44 votruba
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    +1^2560006545746544
    6.4.2023 03:22 J
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Naprosty souhlas. Php mi pripomina rok 1998 kdy v Praze kazdy Slovak kodil v PHP pro nekoho stranky ktere delali uplne hovno ale potrebovali mysql databazi protoze to bylo cool. Dle blogu bych rekl ze autor udrzuje nejaky takovy vytvor. Se divim ze je zakaznici s timhle jiz neposlali do prdele.
    6.4.2023 18:42 kvr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Tak jenom pro úplnost, našel jsem ten kus kódu:

    php var_dump(substr("a", 1)); bool(false)

    Měli koule na to, aby i za cenu backward incompatibility to opravili už v Php 7 (poslední Php 5.6 ještě vrací false). Od Php 8 už vrací "" i index mimo rozsah, tedy třeba 2 na string délky 1. Což je s otazníkem - "normální" jazyky vyhodí exception, ale to je u Php nadstandard...
    6.4.2023 06:50 Kde PHP, tam nebezpečno
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Ondřej Surý: "I fail to see how this is a bug if you feed it garbage"

    Hackers everywhere: "Let's feed it garbage and see what happens..."

    PHP: "Access granted."

    Co jsem ti udělal, Ondřeji, že mě takhle trestáš? Pošlete ho někdo prosím na kurz základů počítačové bezpečnosti. Nebo radši na dva.

    6.4.2023 09:44 podlesh
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Naštěstí máme rok 2023, takže to někdo napráskal a bud dostal CVE. Na to si dneska nikdo netroufne říct "opravovat to nebudeme, git gud losers".
    6.4.2023 10:55 plostenka | blog: plstnk
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    No fakt ze jo... rofl
    mirec avatar 6.4.2023 08:32 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Z vtipných vlastností PHP typu to hádam nemôže byť pravda ešte vyberám:

    Prečo majú PHP funkcie tak divné názvy?

    Pretože hashovacia funkcia pre funkcie bola strlen. Preto aby boli hashe funkcí rozdelené rovnomerne museli mať názvy funkcií rovnomerné rozdelenie dĺžky.

    Alebo vo verzii 7 a menej:

    php > if (undefined) { echo "tadaa"; }
    tadaa

    Bez varovania iba s poznámkou. A teraz si predstavme kód plný niečoho takého:

    define(ma_prava, array_key_exist(...)); ... if (ma_prava)

    Všetko funguje krásne kým sa kódu nechytí niekto ďalší a nezabudne na define na vrchu.

    Vo verzii 8 (3x hurá) to skončí aspoň chybou (alebo varovaním, že došlo k chybe? :D)

    php > if (undefined) { echo "a"; }
    PHP Warning:  Uncaught Error: Undefined constant "undefined" in php shell code:1
    Stack trace:
    #0 {main}
      thrown in php shell code on line 1
    
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    Jendа avatar 8.4.2023 22:38 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    OMG, a to mi tvrdili, že PHP: a fractal of bad design je už v nových verzích PHP (7, 8) vyřešené.

    Ale asi to nikoho nepálí, když furt nikdo neudělal náhradu pro nějaký normálnější jazyk (ne, rezidentní aplikace např. ve Flasku, nebo cold-start celého interpretu Pythonu při každém requestu, opravdu nejsou náhrada).
    AraxoN avatar 6.4.2023 07:37 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Riešenie som doplnil do článku!

    Úspešným riešiteľom menujem mireca, aj keď viacerí boli odpovedi celkom blízko.

    Pekné sviatky všetkým.
    6.4.2023 10:12 phpsucks
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    hehe jelita jeste si zkuste doma tohle

    md5('240610708') == md5('QNKCDZO')

    => bool(true)
    mirec avatar 6.4.2023 11:34 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Ňuňuňu automatické pretypovanie na číslo.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    mirec avatar 6.4.2023 12:46 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Tu by som asi každému používateľovi PHP (programátorovi?) odporúčal všade používať ===. Problém je, že človek sa mýli a občas jeden znak zabudne.

    Ako bývalého PHPčkára ma táto náchylnosť na chyby nesmierne unavovala. Skoro každá funkcia je nejakým spôsobom zle implementovaná z čoho vyplýva, že pri každom volaní si programátor musí prejsť corner casy a to neskutočne unavuje a je to náchylné na chyby.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    6.4.2023 21:25 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Zaleží asi aj od typu programovania. Tak:
    $position=strpos($text, "something");
    if($position=== false)
       return false;
    
    je asi programátorsky ľahšie ošetrenie podmienky ako:
    errno=0;
    value=atoi(input);
    if(errno != 0)
       return -1;
    
    debian.plus@protonmail.com
    mirec avatar 7.4.2023 11:57 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST

    Keď už tak tie príklady by mali byť aspoň ekvivalentné. Takže v C by to bolo:

    char *found = strstr(text, "vyraz");
    if (!found)
        return ...

    Alebo v druhom prípade ten prevod čísel:

    if (!is_numeric($input)) {
        return -1;
    }
    $value = (int)$input;
    

    Bez explicitnej kontroly pretypovanie vráti 0 čo môže mať za následok neočakávané správanie aplikácie.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    7.4.2023 12:36 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Prvý môj príklad bol zámerné v PHP, druhý v C. Ak čakáš od PHP ako lepšie C, tak PHP je okey.

    P.S.: strstr/memmem vracia v C na chybu NULL.
    debian.plus@protonmail.com
    7.4.2023 21:45 kvr
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    strstr vrací NULL v případě, že hledaný string není nalezen. Chyba jako taková nenastává (respektive může nastat SIGSEGV pochopitelně).

    Ten kód v C s errno nebude fungovat - atoi errno nemění. Dá se použít strtol neb std::stoi, druhá zmíněná vrací exception, pokud nelze zkonvertovat vůbec nic.

    Java a jiné modernější jazyky jsou na tom ještě líp - vrací pouze validní výsledek, v opačném případě exception. Takže typický kód (který nezajímají chyby) je na jediný řádek. V C i novém C++ tyhle věci pořád ještě z velké části chybí.
    8.4.2023 00:36 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    S atoi mas pravdu. Tak tam treba pouzit scanf. Skusil som strtol, ale ani to to nie je celkom ono (ak detekcia a ka regulerny vyraz). Tak zostava sscanf():
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int number;
    	int result;
    	
    	char buffer[100]={0};
    	
    	
    	fgets(buffer, 100, stdin);
    	
    	result=sscanf(buffer, "%d", &number);
    	if(result == 1)
    		printf("Number %d.\n", number);
    	
    	return 0;
    }
    
    debian.plus@protonmail.com
    Bystroushaak avatar 7.4.2023 14:43 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: PHP hádanka: chýbajúce dáta v $_POST
    Tu by som asi každému používateľovi PHP (programátorovi?) odporúčal všade používať ===. Problém je, že človek sa mýli a občas jeden znak zabudne.
    Já bych šel ještě dál a používal ====. Kdyby šlo do nejhoršího a bylo třeba porovnat extra těžké váhy, tak =====.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.