Autor Zpráva
thomson
Profil *
Dobrý večer,

mám vytvořenou registraci a samozřejmě chci vytvořit i možnost poslání nového hesla když ho člověk zapomene, ale nevím jak bych to měl udělat. Nejde mi o script, ale slovně vyjádřit, co bych měl kontrolovat, na co bych si měl dávat pozor, aby se to nedalo zneužít. Tím myslím třeba zlomyslné měnění hesla, atd. Děkuju
Alphard
Profil
třeba se na e-mail v profilu uživatele odešle zpráva, ve které se informuje o žádosti na nové heslo a uvede se odkaz, na který když klikne, tak se vytvoří nové heslo a pošle se mu na e-mail
thomson
Profil *
Tu první část, jsem nepochopil, jak to zabrání někomu aby někomu zlomyslně změnil heslo...?
YoSarin
Profil
thomson
Tak, že heslo sice změní, ale pouze uživatel, kterému daný účet patří, se dozví dané heslo...
Zlomyslnému měnění hesel můžeš zabránit třeba uživatelem definovanou otázkou a odpovědí.
Zerog
Profil
jednoduse.

Pri registraci uzivatele uloz mail..kdyz pak nekdo zapomene heslo ..tak napise mail do kolonky a kdyz se ty maily zhoduji tak na nej posles vygenerovane nove heslo.
komár
Profil *
Zerog

to by fungovalo, ale má to chybu v tom, že by nemohl zobrazovat email v profilu.
komár
Profil *
sakra, omylem odeslal...

Já to mám tak, že nejdřív vloží email na který chce poslat heslo, je prakticky jedno který to je email, pak naskočí kontrolní otázka a když jí odpoví stejně tak se mu na ten email pošle nové heslo. Email nekontroluju jelikož se může stát že člověk změní email, takže má možnost si to poslat někam jinam.
Akacko
Profil
komár - to by fungovalo, ale má to chybu v tom, že by nemohl zobrazovat email v profilu.

a proč???? vždyť heslo k e-mailu zná jen majitel ne?
komár
Profil *
Akacko

ano, ale když by si byl zlomyslný člověk a v profilu si viděl email, tak ho použiješ a změnít mu heslo..sice se k němu nedostaneš, ale jsme zpátky u zlomyslného měnění hesla
YoSarin
Profil
komár
Chceš, aby člověk který zapoměl heslo měl možnost si ho změnit, ale zároveň aby nikdo jiný to heslo změnit nemohl. Jak chceš (bez hesla) odlišit toho kdo se snaží heslo změnit oprávněně od toho kdo je jen zlomyslný? Tady ti pomůže pouze ta kontrolní otázka, nebo mail který se bude kontrolovat proti zadanému při registraci. Rozhodně bych nedával možnost zaslat heslo na libovolný email a kontrolovat jen odpověď na otázku.

V podstatě potřebuješ dvě hesla (něco jako PIN a PUK ;) )
Alphard
Profil
znovu připomínám svou možnost odeslání 2 e-mailů:
1. mail: odešle se odkaz pro změnu hesla - to je ochrana proti zlomyslnému měnění, pro změnu je nutné přejít na odkazovanou stránku (útočník se nedostane do cizí schránky)
2. mail: jsme na odkazované stránce, mohl se k ní dostat pouze majitel e-mailu, takže je ověřen a pošleme mu e-mail s novým heslem
YoSarin
Profil
Alphard
A to vůbec nezní špatně... Já to z toho tvého prvního nástinu pochopil nějak špatně... :)
thomson
Profil *
děkuju všem za odpovědi
komár
Profil *
Alphard

jak řekl, YoSarin, opravdu to nenzí špatně, samozřejmě by tam musel být limit - jeden odkaz denně, jinak by kdokoliv mohl vyspamovat email, pak by mi vadilo (možná jenom mě, ale já jsem perfekcionalista) poslat na email s odkazem a pak po kliknutí na odkaz se zase pošle další email - moc emailů) ale asi jinak nejlepší řešení. Si to předělám. Což by mě zajímalo jak by vypadal ten odkaz. Předpokládám že v něm musí být identifikace uživatele, jelikož by script nevěděl komu změnit to heslo, jak by to mohlo vypadat?
one
Profil
To by mě taky zajímalo, ale mě spíš jen co tam mám dát jako tu identifikaci, aby to bylo bezpečné, jestli např. id uživatele nebo už. jméno a nějak to zamd5tkovat...
a odkaz předpokládám jen kontrolovat pomocí GET zda souhlasí s tím id nebo co se vybere pro identifikaci v databázi, je to tak?
díky za odpovědi
YoSarin
Profil
one
to je uplně jedno jak uděláš odkaz - třeba MD5 aktuálního timestampu (to pak skoro nikdo nemá šanci trefit). Jen si musíš v db uložit, že tenhle hash se týká tohohle mailu.
one
Profil
dík, takže by to mělo vypadat nějak následovně:
1.Uživatel vyplní třeba už. jméno a email do formuláře
2.Jestliže zadané už. jméno a email souhlasí s těmi v databázi, v databázi nastavíme položku a_key na md5 aktuálního timestampu a odešleme mail s odkazem
3.Jestliže hash v odkazu souhlasí s tim v databázi tak pošleme na dříve uvedený email nové heslo
4.A script je na světě, že? :)
YoSarin
Profil
one
Asi tak. :) ale můžeš vynechat to zadávání uživatelského jména - tzn. hlídat jen podle mailu. ;)
one
Profil
ještě mě teď napadlo, je potřeba udělat i nějaký předem určený čas do kterého bude ten odkaz platný(třeba den)? používate to?
komár
Profil *
one

když máš timestamp tak už to není problém ne...jak jsem psal...kontrolovat odeslání, prostě možnost odeslání jednoho odkazu denně/týdně na email...takže když klikneš na odkaz z emailu zkontroluješ jestli timestamp je delší jak jeden den.
World
Profil
komár
špatně sis převzal moji otázku, já jsem se neptal jak (to je pohoda), ale jestli je vhodné to využít, možná že se ptám na věci, které jsou inviduální, ale když už mám tu možnost, tak se ptám.

btw. za md5tkový timestamp se bude asi těžko kontrolovat nemyslíš? nebo ho maximálně nějakou funkcí, ale to by bylo myslim dosti duležité na takovou věc, lepší bude si uložit aktuální čas v normálnim formátě do databáze a pak do souboru kde bude aktivační odkaz hodit podmínku, zda je čas v databázi větší jak jeden den (ještě lepší je si ukládat rovnou datum, aby ihned po půlnoci už si mohl uživatel zažádat o nové heslo a nemusel čekat do toho času, kdy si o heslo zažádal předtím). Omlouvám se, jestli jsem napsal něco blbě, phpko se teprve učim, a často se učím tak, že to zkouším do té doby, dokud to prostě nejde, a pokud to nejde, tak se tu zeptám :)

ps: omlouvám se, toto je můj druhý účet, zapoměl jsem se přehlásit, no vlastně to je celkem jedno :)
účet one užívám na notebooku a účet World na běžném pc
komár
Profil *
World

špatně jsem se vyjádřil, ale v podstatě jsem myslel to co si napsal...

to už je jedno kdy odkaz stane neplatným a kdy si uživatel může poslat další odkaz, když máš datum prvního odeslání tak můžeš dělat v podstatě cokoliv...i takovou perverzi jako že bude moct poslat odkaz od 0:12:34 :D hlavně je potřeba kontrolovat čas při odesílání odemailu s odkazem...popřípadě tam hodit nějakou hlášku a kdy uživatel bude moct poslat znovu...a kontrolovat čas u vygenerovaný stránky a když bude neplatná tak přesměřevat, nějakej text..atd...jinak jak jsem psal nadtím, řešil jsem to jinak, takže si to jdu taky předělat, pokud bude ještě toto téma nějak aktuální určitě sem napíšu nějaký poznatky a problémy, který zatím nejsou očividný:-)
komár
Profil *
funguje to pěkně...bez problémů... :-)
one
Profil
Já jsem se do tohoto scripti pustil až teď, ale bohužel jsem se neobešel bez problemů a to i přesto, že jsem tu napsal postup, ale nejspíš to bude jen nějaká menší chybka, zde je kód:

//zde je struktura emailu

//kontrola aktivačního kódu
if (isset($_GET['forgot_password']) and $_GET['key'] == "$a_key") {

//kontrola zda se aktivační kód rovná tomu v databázi
$sql_key_check = $db->sql_query("SELECT `key` FROM `account` WHERE `key` = '".$a_key."' LIMIT 1");
$key_check = $db->sql_numrows($sql_key_check);

if($key_check == 1) {

//nastavení nového hesla a datum, kdy se nastavilo
$db->sql_query("UPDATE `account` SET `password` = '".$new_password."', `new_password` = NOW() WHERE `key` = '".$key."' LIMIT 1");

//poslání emailu s novým heslem
mail($email, $subject, $message2, $headers);

}else{
echo "Požadovaný kontrolní klíč nesouhlasí s tím v databázi.";
}
}else{
echo "Nastala chyba při zasílání emailu s novým heslem!";
}

a vždy to vypisuje tu hlášku: Nastala chyba při zasílání emailu s novým heslem..

btw. ty hlášky jsem psal jentak zběžně (takže nejspíš nedavají smysl), abych zjistil, kde se script zastaví...
komár
Profil *
chybu máš tady :

 $key_check = $db->sql_numrows($sql_key_check); 


 takže $key_check = $db->sql_num_rows($sql_key_check); 



jinak já to řeším jinak...
mám dejme tomu jen 2 tabulky..s registrovanými uživateli a tabulku peo poslaná hesla s loginem, email, časem (názvy sloupců)

stránka vypadá takhle: input, submit

vloží někdo nick (a když nepočítám kontrolu jestli tam jsou zakázaný znaky..atd) tak zkontroluje jestli je takový uživatel regitrovaný...pokud ne, hodí hlášku že nemůže poslat heslo jelikož není registrovaný
pokud ano, zkontroluje jestli je v tabulce pro odesílání hesla, pokud ne, odešle email a zapíše se do tabulky s časem odeslání
pokud je v tabulce pro odesílání hesla tak si z tabulky veme cas, pak pomocí date() vemu čas který je právě teď, odečtu od sebe a zjistím jestli už je čas další jak jeden den po odeslání prvního hesla, pokud není hláška že může poslat až další den
pokud je druhý den od odeslání a více tak pošle email a buňku s časem updatuju na čas kdy si odeslal po druhý (třetí, čtvrtý...)
World
Profil
chybu máš tady :

$key_check = $db->sql_numrows($sql_key_check);



takže $key_check = $db->sql_num_rows($sql_key_check);


může se používat i sql_numrows, jsem si tím na 100% jísty, jelikož to používám v ostatních scriptech, kde to funguje v pohodě, takže chybka bude jinde, ještě zkontroluji, zda jsou naplněny všechny proměnné.

tvoje řešení: jj také dobré, ale já bych to právě chtěl mít jenom v jedné tabulce. no nic asi si stím budu ještě budu muset pohrát...

edit: hm, tak to mám asi celé nějaké rozbité, nemáte už někdo hotový script? že bych si to podle něj zkusil opravit, popř. ho celý použít?

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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