» »

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.
http://www.r00li.com

Binji ::

2. MD5 enkripcija
Kdor ne navija ni Slovenc, hej, hej, hej!

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 )

Ziga Dolhar ::

ad 1) Kako pa "delaš", da ni občutljivo?
https://dolhar.si/

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...

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.
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

roli ::

TOčnot ot je razlog zakaj hočem vsaj malo zaščititi ta gesla.
http://www.r00li.com

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.

roli ::

Tole bom še videl - najbrž bom dodal tudi to stvar.

Drugače pa sem ravnokar dodal md5 in deluje tako kot mora.
http://www.r00li.com

Baja ::

koda:
// 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 ()

KoMar- ::

Pa raje uporabi sha1() kot md5()... MD5 je že precej ranljiva zadeva...

zerox ::

Ne vem no če je ravno razlika še med njima... :)

Link

Zgodovina sprememb…

  • spremenil: zerox ()

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.
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;

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.
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 :-).
https://dolhar.si/

Zgodovina sprememb…

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 :)

Gost ::

Mogoče zaradi register_globals=on?

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):
			<?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']."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::Objavil: ".$novica_show['avtor']."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::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']."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::Objavil: ".$prikaz2['avtor']."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::Komentarjev: </div>";
			
			}
			
			
			switch($_GET['novica']) 
			{
   			 case 'prikazi':
   			    prikazinovico($_GET['id']);
        		break;
    		default:
        		prikaznovic();
			}

			
		?>

http://www.r00li.com

roli ::

Ah sem že pogruntal! Sedaj deluje tako kot bi moralo!
http://www.r00li.com


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

php+enkripcija gesla

Oddelek: Programiranje
162199 (1704) Housy
»

Razbijanje gesel z GPU je realnost (strani: 1 2 3 )

Oddelek: Novice / Varnost
10230658 (25089) MrStein
»

Analiza slovenskih gesel

Oddelek: Novice / Zasebnost
3912183 (10121) BlueRunner
»

Manj znane varnostne ranljivosti PHP programske kode

Oddelek: Novice / Varnost
314308 (2983) R33D3M33R
»

Skrivanje gesel

Oddelek: Izdelava spletišč
393172 (2412) Tr0n

Več podobnih tem