Forum » Izdelava spletišč » PHP - Register form
PHP - Register form
roli ::
Torej pred kratkim sem dokončal svoj prvi form za registracijo v PHPju, ki podatke vpisuje v mysql bazo. Vprašanja, ki pa se tukaj pojavljata pa sta:
1.) Kako poskrbeti, da bo polje za geslo občutljivo na male in velike črke - ker trenutno ni?
2.) Kako poskrbeti, da jaz kot administrator gesla nekega uporabnika ne bom mogel videti v phpmyadminu - torej bi ga kriptiral al karkoli se že tu dela.
1.) Kako poskrbeti, da bo polje za geslo občutljivo na male in velike črke - ker trenutno ni?
2.) Kako poskrbeti, da jaz kot administrator gesla nekega uporabnika ne bom mogel videti v phpmyadminu - torej bi ga kriptiral al karkoli se že tu dela.
http://www.r00li.com
mile ::
oba problema naenkrat rešiš z md5(), drugače pa case sensitive selecte po stringi-h delas z ustreznim collation-om ( recimo utf8_bin )
zerox ::
Eni md5(& sha1) več ne smatramo za enkripcijo :) ... Odvisno od tega kako zelo si bo želel administrator videt gesla. (mavričnetabele).
1. Če boš geslo hranil kot md5 hash ipd.. ter gesla ne boš spreminjal najprej(pred zgostitijo) v male oz velike črke, bo le-to zagotovo občutljivo na male oz. velike črke. Sedaj zadeve verjetno hraniš v plaintextu (čistopisu :)) baza pa ni case sensitive...
1. Če boš geslo hranil kot md5 hash ipd.. ter gesla ne boš spreminjal najprej(pred zgostitijo) v male oz velike črke, bo le-to zagotovo občutljivo na male oz. velike črke. Sedaj zadeve verjetno hraniš v plaintextu (čistopisu :)) baza pa ni case sensitive...
zerox ::
ad 1) Kako pa "delaš", da ni občutljivo?
a.Plaintext & case insensitive database?
b.strtolower (strtoupper) pred zgostitvijo
roli ::
Si bom ogledal malo ta MD5. Drugače nimam ravno želje vohljati po geslih uporabnikov ampak bi rad vsaj malo zaščitil gesla. Sicer pa tako ali tako ne gre za nekaj kjer bi rabil nevmkakšno varovanje.
Trenutno so gesla shranjena v Plain Textu - baza pa uporablja utf8_bin kodno tabelo - če sem prav prebral ta ni case sensitive.
Trenutno so gesla shranjena v Plain Textu - baza pa uporablja utf8_bin kodno tabelo - če sem prav prebral ta ni case sensitive.
http://www.r00li.com
drola ::
No, gesel se vsekakor ne sme hraniti v plaintextu, četudi gre v primeru konkretne aplikacije za nekaj, kar ni toliko pomembno. Težava je namreč v tem, da večina uporabnikov uporablja za kup spletnih strani/servisov/trgovin/... isto geslo. In če se geslo razkrije na 1 mestu, se da dostopat praktično do vsega.
https://drola.si
Baja ::
gesla lahko tudi malo 'osolis' - geslu dodas nek poljuben string. se postopek
za generiranje gesla:
1. naredis md5 nekega nakljucnega zaporedja znakov (cas, uniqid, rand ...) = dobis 32 znakov
2. vzames 5 (ali vec, manj) znakov za 'sol'
3. naredis md5 'soli' + geslo, torej $x = md5( $sol . $pass )
4. kreiras password hash iz tocke 2 + tocke 3.
v tocki 4 torej dobis 37 znakov dolg hash. ce hjoces osoljevanje malce zakriti vzames iz stringa v tocki 3. 5 znakov in nato sestavis. tako dobis 32 znakov dolg hash. kjer je prvih 5 znakov sol. na pogled pa se hash ne razlikuje od noosoljenega.
preverjanje:
1. mas username in password
2. preberes password hash od username-a
3. izluscis sol (prvih 5 znakov)
4. naredis md5 soli + podanega gesla
5. sestavis string 3 in 4 in primerjas ce je enak tistemu v bazi
ce si password hash skrajsal na 32 znakov, moras isto narediti pri preverjanju.
s tem pridobis to da imajo enaki passwordi razlicne md5 hashe. mislim, da je tudi razbijanje takih gesel precej bolj komplicirano kot samo md5.
za generiranje gesla:
1. naredis md5 nekega nakljucnega zaporedja znakov (cas, uniqid, rand ...) = dobis 32 znakov
2. vzames 5 (ali vec, manj) znakov za 'sol'
3. naredis md5 'soli' + geslo, torej $x = md5( $sol . $pass )
4. kreiras password hash iz tocke 2 + tocke 3.
v tocki 4 torej dobis 37 znakov dolg hash. ce hjoces osoljevanje malce zakriti vzames iz stringa v tocki 3. 5 znakov in nato sestavis. tako dobis 32 znakov dolg hash. kjer je prvih 5 znakov sol. na pogled pa se hash ne razlikuje od noosoljenega.
preverjanje:
1. mas username in password
2. preberes password hash od username-a
3. izluscis sol (prvih 5 znakov)
4. naredis md5 soli + podanega gesla
5. sestavis string 3 in 4 in primerjas ce je enak tistemu v bazi
ce si password hash skrajsal na 32 znakov, moras isto narediti pri preverjanju.
s tem pridobis to da imajo enaki passwordi razlicne md5 hashe. mislim, da je tudi razbijanje takih gesel precej bolj komplicirano kot samo md5.
roli ::
Tole bom še videl - najbrž bom dodal tudi to stvar.
Drugače pa sem ravnokar dodal md5 in deluje tako kot mora.
Drugače pa sem ravnokar dodal md5 in deluje tako kot mora.
http://www.r00li.com
Baja ::
koda:
tole zgenerira 37 mest dolg hash, za 32 mest pa bi bila funkcija nekako takole:
// genererimo 5 mest dolg salt za password // rabimo samo pri kreiranju gesla $salt = substr(md5(uniqid(rand(), true)), 0, 5); // generiramo hash za password iz salta in plain text gesla function hashPass($salt, $password){ return $salt . md5($salt . $password); } // primerjamo hash vpisanega gesla in shranjen hash // vrne true ce je enako, false ce je razlicno function comparePass( $password, $hash ){ // izluscimo salt $salt = substr($hash, 0, 5); return $hash == hashPass($salt, $password); }
tole zgenerira 37 mest dolg hash, za 32 mest pa bi bila funkcija nekako takole:
function hashPass($salt, $password){ return $salt . substr( md5($salt . $password), 5 ); }
Zgodovina sprememb…
- spremenil: Baja ()
roli ::
Še eno vprašanje: Kako obdržati podatke, ki jiih je uporabnik vpisal, če pride do napake?
Trenutno imam narejeno eno funkcijo, ki preverja celotne podatke in izpiše napake, ter poveča število napak za 1. Del, ki v resnici pokaže formo in zapiše podatke pa preprosto preveri število napak, če ni napak pa potem podatke vpiše v bazo. Ampak, če greš nazaj na prejšnjo stran potem izgubiš vse kar je bilo vpisano v formo.
Trenutno imam narejeno eno funkcijo, ki preverja celotne podatke in izpiše napake, ter poveča število napak za 1. Del, ki v resnici pokaže formo in zapiše podatke pa preprosto preveri število napak, če ni napak pa potem podatke vpiše v bazo. Ampak, če greš nazaj na prejšnjo stran potem izgubiš vse kar je bilo vpisano v formo.
http://www.r00li.com
Baja ::
ena moznost je da shranis v session pravilne podatke
torej ce je podatek OK
$_SESSION['postada'][podatek1] = $podatek1;
$_SESSION['postada'][podatek2] = $podatek2;
na strani s formo preveris ce obstaja $_SESSION['postdata'] in ven preberes podatke (ti so vredu in jih vpises), za ostale izpises napake.
lahko pa si shranis tudi celoten $_POST[] -> $_SESSION['postdata'] = $_POST;
torej ce je podatek OK
$_SESSION['postada'][podatek1] = $podatek1;
$_SESSION['postada'][podatek2] = $podatek2;
na strani s formo preveris ce obstaja $_SESSION['postdata'] in ven preberes podatke (ti so vredu in jih vpises), za ostale izpises napake.
lahko pa si shranis tudi celoten $_POST[] -> $_SESSION['postdata'] = $_POST;
Ziga Dolhar ::
(ne pozabit na session start funkcijo, se ne spomnim vec tocn kako se imenuje)
https://dolhar.si/
roli ::
To deluje čeprav sem se namučil, da mi je uspelo PHP kodo prikazat sredi forme. Glede na to, da za prikaz le te uporabljam echo je bilo potrebno kar nekaj združevanja... Na koncu mi je uspelo nekako takole:
value='".$_SESSION['uporabnisko']."'
EDIT: Zdajle sem testiral tole in deluje tako kot mora. Po zapisovanju podatkov o regisraciji pa sem še dodal session_destroy(), ki potem lepo pobriše podatke.
value='".$_SESSION['uporabnisko']."'
EDIT: Zdajle sem testiral tole in deluje tako kot mora. Po zapisovanju podatkov o regisraciji pa sem še dodal session_destroy(), ki potem lepo pobriše podatke.
http://www.r00li.com
Zgodovina sprememb…
- spremenil: roli ()
Ziga Dolhar ::
O smiselnosti session destroya si poglej mal dokumentacijo.
Aja, pa da ne bos cez cas imel kaksnih cudnih tezav, ker bos se kaj shranjeval v session, pa bo kdaj kar izginilo :-).
Aja, pa da ne bos cez cas imel kaksnih cudnih tezav, ker bos se kaj shranjeval v session, pa bo kdaj kar izginilo :-).
https://dolhar.si/
Zgodovina sprememb…
- spremenil: Ziga Dolhar ()
Gost ::
Če boš imel tudi kak login notri, res raje izbriši $_SESSION spremenljivke z "unset()" in ne s "session_destroy()".
Pimoz ::
kolikor sem se jaz po netu učil so vedno najprej unsetali potem pa še session_destroy()...nevem zakaj sam pol res drži k prbit :)
roli ::
Ok sem lepo zamenjal destroy z unset. Čeprav kaj pretirano velike razlike ne vidim. Vsaj zaenkrat ne. Ampak je mogoče, da bi imel potem probleme.
http://www.r00li.com
roli ::
Sicer bi za tole najbrž lahko ustvaril novo temo ampak bom vprašal kar tukaj.
Sedaj, ko registracija in login delujeta odlično sem se lotil skripte za prikazovanje novic. Tukaj pa je koda delno moja delno pa iz enega tutoriala. Problem je, da mi ne prikaže strani z samo eno novico in komentarji (kot bi moralo) ampak mi vrže, da stran ne obstaja. Po kliku na število komentarjev mi v URL vrstico izpiše index.php?novica=prikazi&id=1 ampak dobim tisti lep error, da stran index.php ni najdena. Seveda pa prikaz navadnih novic deluje kot mora. Tole je celotna koda (razen stvari, ki se tučejo baze):
Sedaj, ko registracija in login delujeta odlično sem se lotil skripte za prikazovanje novic. Tukaj pa je koda delno moja delno pa iz enega tutoriala. Problem je, da mi ne prikaže strani z samo eno novico in komentarji (kot bi moralo) ampak mi vrže, da stran ne obstaja. Po kliku na število komentarjev mi v URL vrstico izpiše index.php?novica=prikazi&id=1 ampak dobim tisti lep error, da stran index.php ni najdena. Seveda pa prikaz navadnih novic deluje kot mora. Tole je celotna koda (razen stvari, ki se tučejo baze):
<?php function prikaznovic() { $poizvedi = "SELECT date_format(datum,'%d:%m:%Y ob %H:%i') AS datum_k,naslov,avtor,novica, id FROM novice ORDER BY datum"; $prikaz= mysql_query($poizvedi) or die(mysql_error()); while ($novica_show = mysql_fetch_array($prikaz)) { $komentarji = $novica_show['id']; $isci_komentarje = "SELECT count(*) FROM novice_komentarji WHERE id_novice= '$komentarji'"; $komentarji_poizvedba = mysql_query($isci_komentarje); $komentarji_rezultat = mysql_fetch_row($komentarji_poizvedba); echo "<div class='news_naslov'>".$novica_show['naslov']."</div>"; echo "<div class='news_podatki'>::Objavljeno: ".$novica_show['datum_k']." ::Objavil: ".$novica_show['avtor']." ::Komentarjev: <a href='.{$_SERVER['PHP_SELF']}?novica=prikazi&id={$novica_show['id']}'>".$komentarji_rezultat[0]."</a></div>"; echo "<div class='news'>".$novica_show['novica']."</div>"; } } function prikazinovico($id) { $poizvedba = "SELECT date_format(datum,'%d:%m:%Y ob %H:%i') AS datum_k,naslov,avtor,novica, id FROM novice WHERE id = $id"; $prikaz_ena = mysql_query($poizvedba); if (mysql_num_rows ($prikaz_ena) == 0) echo "<div class='err_msg'>Novica, ki jo želite prikazati ne obstaja!</div>"; return; $prikaz2 = mysql_fetch_array($prikaz_ena); echo "<div class='news_podatki'>::Objavljeno: ".$prikaz2['datum_k']." ::Objavil: ".$prikaz2['avtor']." ::Komentarjev: </div>"; } switch($_GET['novica']) { case 'prikazi': prikazinovico($_GET['id']); break; default: prikaznovic(); } ?>
http://www.r00li.com
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | php+enkripcija geslaOddelek: Programiranje | 2190 (1695) | Housy |
» | Razbijanje gesel z GPU je realnost (strani: 1 2 3 )Oddelek: Novice / Varnost | 30441 (24872) | MrStein |
» | Analiza slovenskih geselOddelek: Novice / Zasebnost | 12110 (10048) | BlueRunner |
» | Manj znane varnostne ranljivosti PHP programske kodeOddelek: Novice / Varnost | 4291 (2966) | R33D3M33R |
» | Skrivanje geselOddelek: Izdelava spletišč | 3158 (2398) | Tr0n |