Autor | Zpráva | ||
---|---|---|---|
nload Profil * |
#1 · Zasláno: 8. 7. 2010, 22:01:18
Chtěl bych si implementovat nějakou ochranu proti CSFR útoku. Napadlo mě udělat to tak, že se pro každé načtení stránky bude generovat globální token, který se uloží do session a zároveň přidá do všech formulářů na stránce do "action" kus kódu "&__token=nahodnysledznaku". Je i tohle dost bezpečný? Často vidím, že se to řeší přímo u jednotlivých formulářů přidáním hidden inputu, moje řešení by bylo pro celou stránku.
|
||
Alphard Profil |
#2 · Zasláno: 8. 7. 2010, 22:08:51
Jestli to dobře chápu, vaše řešení nepočítá s prací ve více oknech.
V jednom začnu něco dělak, pak si otevřu nějaký odkaz do jiného panelu (vygeneruje se nový token do session), vrátím se do původního, dám odeslat a jestli tam není nějaký záchranný mechanismus, data v háji. |
||
FEIL Profil |
#3 · Zasláno: 8. 7. 2010, 23:10:08
Je také pravidlo, týkajúce sa formulárov na webe - ak nejaká akcia mení stav databázy (pridáva / upravuje / vymazáva položky), treba použiť metódu POST (odkazy používajú metódu GET. Možno to znie odveci ale je to k danej téme.
|
||
FEIL Profil |
#4 · Zasláno: 8. 7. 2010, 23:11:30
Alebo nejak takto?
<form method="post" action="vymaz.php"> <input name="id" value="<?php echo $id; ?>" type="hidden"> <input name="token" value="<?php generate_token(); ?>" type="hidden"> <input type="submit" value="Vymazať"> </form> Kód pre vymaz.php: kód: <?php if (validate_token($_POST['token']) && validate_id($_POST['id'])) { mysql_query("DELETE FROM inzeraty WHERE id = '".$_POST['id']."'"); echo "Vymazané!"; } else { echo "Chyba, odošlite formulár ešte raz."; } ?> |
||
Joker Profil |
#5 · Zasláno: 9. 7. 2010, 00:20:35
Alphard:
„Jestli to dobře chápu, vaše řešení nepočítá s prací ve více oknech.“ Ale neměl by být velký problém to rozšířit na více tokenů, tj. místo tokenu mít v session pole aktivních tokenů. Nová stránka by dostala svůj a starý token by zůstal aktivní. Jen by nebylo od věci nějaké rozumné maximální množství tokenů, aby nevznikla situace, že by nějaký útočník mohl nagenerovat milióny tokenů. Případně možná k tokenu ještě přidat informaci, pro jaký požadavek byl vygenerován. Jednodušší možnost by byla generovat autorizační token při přihlášení a potom používat ten samý po celou dobu existence relace. To je sice méně bezpečné než jednorázové tokeny, ale pořád mi to připadá jako slušná úroveň zabezpečení. |
||
nload Profil * |
#6 · Zasláno: 9. 7. 2010, 04:26:20
Nejlogičtější mi připadá toto: Předpokládám nějaký timeout dejme tomu 20 minut, po kterém dojde k automatickému odhlášení uživatele. Dále mám pro každou stránku zvlášť generované unikátní __token_id a __token, pokud se daná stránka odešle a dojde k úspěšnému ověření, vymaže se daný token ze session, pokud ne, tak se automaticky (po načtení nějaké stránky) vymaže po 20 minutách a nebo pokud bude těch tokenů už moc, tak se vymaže ten nejstarší. Tohle by bylo dost bezpečné, i kdybych ty tokeny připojoval k datům odesílaných metodou get např. "<form method=post action=./stranka.php?__token_id=daf84a9s84f9s&token=f49af4s94afasdf49s>" že?
|
||
Časová prodleva: 14 let
|
0