Autor Zpráva
slovakCZ
Profil
Dobrý den,

mam nasledujici situaci:
uzivatel se mi zaregistruje, do db se ulozi nick, heslo, cas_registrace, active(to je bud true nebo false.. udava to, zda je uzivatel aktivovan nebo ne) a cas registrace. Na mail uzivatele prijde email s potvrzovacim odkazem ktery je v tomto formatu:
http://mujweb.cz/aktivujucet.php?hash=1ba29d8583671d48f2cd6fec637af916

kde prave "1ba29d8583671d48f2cd6fec637af916" = md5(cas_registrace).

jde mi o to, zda je mozne z databaze tahat data nejak takto (tato moznost mi samozrejme nefunguje):
$hash = $_GET['hash'];
mysql_query("SELECT * FROM users WHERE md5(cas) = $hash");


nechci do db zbytecne ukladat tento cas ve formatu "md5", protoze ho vyuziji jen jednou... je sice moznost do url adresy dat dalsi parametr ID a pote tahat data z databaze podle daneho ID a az pote porovnavat zda se md5(cas) = $hash, ale zde se mi zase nelibi, ze pracuji s ID uzivatele.. byl bych radsi, kdyby to zustalo jen takto jak to je...

ptam se tedy, zda je mozne udelat vyber jak jsem jej nastinil vyse?

Dekuji za odpoved.

Tom
slovakCZ
Profil
i kdyz ted me tak napada, kdyz pote administrator zdeaktivuje uzivatele (nastavi tedy ve sloupci active hodnotu false) a uzivatele pote napadne, ze se muze vlastne aktivovat tim, ze klikne opet na link v emailu tak toto asi neni vhodne reseni...

mozna by bylo vhodne to resit tak, ze si udelam zvlast sloupec napriklad s nazvem aktivacni_md5, do ktereho ulozim prave md5(cas_registrace). Kdyz uzivatel klikne na odkaz v emailu, tak se vybere dany uzivatel z db, kde prave GET[hash] = md5(cas_registrace) z databaze, nastavi se ve sloupci active hodnota true a pote se obsah sloupce aktivacni_md5 pro daneho uzivatele vymaze (nebo zmeni na "registrovan"). Tim padem kdyby ho administrator v budoucnu deaktivoval a uzivatel klikl na odkaz v emailu tak uz nebude mit moznost si ucet aktivovat.

Uvaha by mela byt spravna... zeptam se tedy jinak :o)
Jak toto resite vy? tak jak jsem to nastinil nyni? nebo je jeste nejaky jiny, uspornejsi a praktictejsi zpusob "aktivace uzivatelu pres odkaz v emailu"?

Dekuji za diskuzi a za nazory,

Tom
Alphard
Profil
Ten dotaz je správný (teda chybí select, ale to je asi překlep) a $hash musí jít do apostrofů (je to řetězec), takže '$hash'. Jen si nejsem jistý, jestli lze časový datový typ dosadit do md5(), asi by to ale mělo jít. Co znamená nefunguje?
Stejně bych ale přenášel i id uživatele, čas nemusí být unikátní, jistota je jistota. A bude to rychlejší.

[#2]
Nenechával bych nějaké dlouhé lhůty, do e-mailu připsat, že na potvrzení registrace má 3 dny a hotovo.
slovakCZ
Profil
s tim T u selecT to byl preklep.. apostrofy take chybi, psal jsem to v rychlosti (melo jit jen o predstavu), v kodu to ovsem mam.
konkretne muj dotaz vypada takto:
$query = mysql_query("SELECT * FROM `$table` WHERE `md5(cas)`='$GetHash'") or die("MySQL ERROR: ".mysql_error());

a pise to chybu:
MySQL ERROR: Unknown column 'md5(cas)' in 'where clause'

ale uz jsem na to prisel, problem byl v tom ze mam pouzito:
...WHERE `md5(cas)`...

nesmim pouzit uvozovky.. kdyz je nepouziji tak vse funguje jak ma... s tim ID to asi bude pravda, preci jen, nahoda je blbec a i presto, ze ocekavam max. 10 registraci denne tak je mozne ze se 2 uzivatele registruji presne ve stejnou sekundu.. :o)

diky za info, s temi 3mi dny taky dobra poznamka, ktere jiste vyuziji, asi jsem nejaky pretazeny, ze me takove veci nenapadaji :o)
Alphard
Profil
slovakCZ:
nesmim pouzit uvozovky.. kdyz je nepouziji tak vse funguje jak ma
Víte kolik lidí se marně snažilo najít chybu ve vašem dotazu jenom proto, že jste to psal v rychlosti a neodpovídalo to skutečnosti?
Až budete příště pokládat dotaz, věnujte mu prosím víc pozornosti.
AM_
Profil
slovakCZ:
MySQL ERROR: Unknown column 'md5(cas)' in 'where clause'
md5(cas) není název sloupce, takže to nemůžeš cpát mezi ``.

Co se týče problému:
- čas je málo silné kritérium; pokud uživatel bude znát ověřovací algoritmus a bude se chtít registrovat s falešným mailem, je dost pravděpodobné, že během pár pokusů se trefí.
Udělal bych v databázi sloupec "activation_code", který bude po registraci obsahovat jakýkoli dostatečně dlouhý a náhodný údaj (např.
md5(time()*rand())
).
Tento údaj se zároveň uživateli pošle na mail (v podobě activate.php?id=id_uctu&code=...).
Kliknutím na tento odkaz:
- se uživatel nastaví jako aktivní
- se sloupec activation_code u daného uživatele vyprázdní, není možné tedy reaktivovat ručně zablokovaný účet.

Otázka ale je, zda je vůbec nutné zavádět ověření e-mailu; pokud někdo nechce uvést svůj mail, použije třeba <cokoliv>@spam.la (pro pochopení se nejlépe podívat na http://spam.la ).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: