
HTML formuláre - bezpečnosť skrytých prvkov
Chcem sa spýtať ohľadne bezpečnosti PHP, HTML a SQL. Vo formulároch používam skryté prvky, ktoré mi vlastne umožnia zapamätať si niektoré dôležité parametre. Chcem sa spýtať, či sa dajú nejako nabúrať aj tie a teda, či ich treba ošetrovať?
<input type='hidden' name='id' value='$id'>
Všetko je třeba ošetřovat.
//edit
A na co to vlastně potřebuješ. Na tohle se daleko častěji hodí mechanismus sessions.
Pretože pri SESSION si môžem doovliť zabudnúť unset(). Ale m;6no prejdem na session. Len akurát mám obavy z toho, aby som nenechal niečo nastavené, prípadne niekto nebude klikať v rámci postupu a klikne inde a session ostane nastavené. V rámci postupu myslím napríklad, že :
1. zobrazí sa zoznam
2. vyberie prvok na editáciu
3. potvrdí editované hodnoty
No a ak pri kroku dva klikne úplne inde a nechá to tak, tak sa formulárový prvok vymaže, ale session nie.
Kľudne si môžeš pamätať id editovaného prvku v input type=hidden (alebo v url), len pri zobrazovaní stránky a potvrdení editovaných hodnôt musíš overiť, že daný používateľ má právo editovaný prvok meniť.
Akože? Tomu celkom nerozumiem. Chápem, že ak má právo meniť, tak ho nesmiem použiť, lenže, ak bude v URL, tak ho zmení a ani si nevšimnem. Ale ak vo formulári, tak ako zabránim zmene? Teda, ako zistím, že ho môže/nemôže zmeniť?
Napr. tak, ako je to spravené tu pri editovaní príspevku: Identifikátor príspevku je v URL, pričom sa kontroluje, či daný používateľ môže editovať zadaný príspevok.
To záleží na logike tvojej aplikácie.
Dobre, takže začínam rozumieť. Ja mám všetko vo formulári, takže v url nevidieť nič. Lenže pri zobrazení zoznamu si nastavím skrytý prvok vo formulári s menom meno1 na 1. Potom po výbere položky v zozname sa kontroluje hodnota meno1. Ak je tam 1, tak sa zobrazí formulár na editáciu. Po potvrdení sa v meno1 nastaví nová hodnota alebo v inom skrytom prvku sa nastaví ďalšia hodnota a teda rozhranie vie, že sa postúpilo o krok. Lenže, ak tam niekto zmení id, tak sa to celé zrúti. Ak to bude v url a povedzme, že dám editáciu, tak aby som mohol overiť, či používateľ má právo editovať, musím mať niečo v zálohe podľa čoho to overím. To môže byť session, pretože session nemôže zmeniť, lenže problém vznikne tak, že ak to raz nastavím v session a používateľ sa rozhodne nepotvrdiť editáciu a klikne inde, tak v session ostane nastavená hodnota. Ja to teda dávam do skrytého prvku, ktorý sa vymaže, lenže ten môže užívateľ zmeniť a tým si urobiť, čo sa mu zachce a to je to, o čo mi ide. Neviem, či ja správne chápem teba, ako to chceš overiť, či má právo editovať.
Potrebuješ si pamätať nejaké údaje z predchádzajúcich krokov? Ak áno (a nie je to len nejaká jedna hodnota), tak potom si to ulož do session.
Prečo nastavuješ pri zobrazení zoznamu meno1=1 - čo táto hodnota znamená?
Kvôli čomu program spadne, ak je v meno1 neočakávaná hodnota?
Keď bude v meno1 hodnota 1, tak sa zobrazí formulár na editáciu, keď 2, tak sa obsah formulára zapíše do databázy.
Takže ti vlastne nevadí, ak si niekto sám zmení hodnotu v meno1. V čom je potom problém?
Aha, takže začínam chápať. Hodnoty, ktoré sú skrytými prvkami vo formulári a mohol by ich používateľ zmeniť a je nutné udržať ich v poriadku, treba dať do session. Session si vlastne nastavím až vtedy, keď sa dostanem do editovania, čiže meno1 == 1. Potom pri meno1 == 2 len vytiahnem hodnoty zo session a teda budú chránené.
Lenže teraz otázka:
Zobrazí sa zoznam, čiže meno1 sa akurát nastaví na 1, lenže id ešte nie je uložené v session, pretože ešte si používateľ tlačítkom nevybral položku a teraz nastaví on sám meno1 na 2 a do id dá nejakú hodnotu?
Aha, práve ma napadla odpoveď: Session nie je nastavené a teda pri kontrole meno1 == 2 stačí zamietnuť editáciu, pretože id má byť už v session a tam nie je nič.
NO a teraz ma napadlo, že to by som si mohol hackovať tak vlastný zoznam, pretože to, čo sa nebude dať editovať v id nikdy vlastne nebude, pretože sa v zozname položka s takým id nezobrazí na editáciu (tým myslím zmenu registračných údajov pre prihlasovanie na stránke a podobne). Takže asi preto sme si nerozumeli.
Znamená to, že to čo popisujem je bežpečné, pokiaľ si to používateľ nebude chcieť zabúrať sám? (Prihlasovacie údaje o registrovaných má možnosť editovať len administrátor.)
Tá hodnota meno1 nemusí byť v session a vlastne nemusí byť vôbec na stránke.
Na webovú aplikáciu sa nemôžeš pozerať ako na windows aplikáciu (v Microsofte to tak skúsili a vyšiel z toho ASP.NET). Je to vždy len požiadavka - odpoveď. Vstup od používateľa je v GET (url), POST (vyplnený formulár) alebo COOKIE. Všetky tieto vstupy musíš vždy kontrolovať. Tvoja pamäť je v SESSION - tam si pamätáš informácie ku danému používateľovi.
1. Používateľ chce niečo editovať, tak si vyžiada formulár (=požiadavka GET na /formular.php) - ty mu ten formulár dáš (=HTML s formulárom).
2. Používateľ odošle vyplnený formulár (požiadavka POST napr. tiež na /formular.php) - tak tie hodnoty uložíš a povieš mu, že je to uložené (=redirect na HTML s textom) prípadne mu podáš nový prázdny formulár (=redirect na /formular.php).
Tebe je v podstate jedno, či používateľ odošle vyplnený formulár bez toho, aby si ho predtým vyžiadal. Takéto veci ošetrovať nemusíš. Musíš iba skontrolovať, či je ten formulár vyplnený správne.