Samo dve usputne napomene.
Kao prvo nadam se da je poznato da su direktni upiti tipa
Code:
SELECT password FROM korisnici WHERE username = '$username'
visoko podložni SQL injekciji i da je pre bilo kakvog izvršavanja dotičnog upita potrebno iskoristiti primera radi
mysql_real_escape_string funkciju nad svim vrednostima koje dolaze direktno iz forme. Naravno pre toga je potrebno proveriti da li je uključen
magic_quotes sistem i pre toga očistiti prosleđene vrednosti od escape-ovanih karaktera. Krajnji odbrambeni mehanizam je
addslashes(). Sve navedeno otpada u slučaju korišćenja skladištenih procedura (stored procedures) koje mogu da se koriste u verziji 5 MySQL-a.
Druga stvar. Lično kod provere legitimnosti unetih podataka korisnika u login formi koristim metod
Code:
SELECT username FROM korisnici WHERE username = '$username' AND password='$password'
iz jednostavnog razloga što je iz sigurnosnih razloga preporučljivo u svim situacijama kada postoji više kriterijuma za ocenu ispravnosti nekog podatka iskoristiti što je moguće više dostupnih uslovljavanja. Primera radi u upitu
Code:
SELECT password FROM korisnici WHERE username = '$username'
potencijalnom napadaču je ostavljeno dosta mesta za manevrisanje jer upit bez ikakvih pitanja vraća lozinku za svako uspešno pogođeno korisničko ime.
Zaštita sa proverom korisničkog imena i lozinke je utoliko sigurnija ako se koriste skladištene procedure.
Usput... Nikada ne treba obelodanjivati korisniku šta tačno nije u redu kod podataka koji su korišćeni u login formi. U tim slučajevima treba biti maksimalno nekooperativan i obavestiti korisnika da je logovanje neuspešno ili zbog korisničkog imena i/ili zbog lozinke ili čak samo da je login neuspešan :)
@Tesla
U svom kodu imaš dosta konceptualnih grešaka.
Kao prvo ako si imao nameru da proveru ispravnosti podataka izvršiš u istom dokumentu gde ti se nalazi forma (stranica sa formom poziva samu sebe) onda si trebao redirekciju da izvršiš direktno iz PHP-a a ne putem Javascripta. To znači da bi nakon slanje forme odmah na početku fajla trebao da imaš deo koji proverava ispravnost forme i koji će putem funkcije
header() da preusmeri tok izvršavanja na stranicu koja bi sadržala poruku o uspešnom logovanju. Ako bi kojim slučajem podaci bili neispravni onda bi taj deo sa redirekcijom jednostavno bio preskočen a ti bi mogao lepo u formi da naznačiš delove koji nisu ispravni.
Sledeća stavka je da se tvoj kod oslanja na činjenicu da je na serveru na kome se izvršava fajl
register_globals uključen tj. da su dozvoljene globalne promenjljive. Šanse da je to slučaj sa nekim novijim serverom su otprilike ravne nuli :) Umesto globalnih promenjljivih treba da koristiš superpromenjljive
$_POST,
$_GET,
$_SESSION,
$_COOKIE... Razlog za ovo je potencijalni rizik po sigurnost aplikacije.
Usput...
session_register() je zastarela funckija koja se više skoro i ne koristi. Umesto nje preporučuje se direktno deklarisanje promenjljive putem
$_SESSION-a i inicijalizacija na neku početnu vrednost.
Generalna koncepcija tvog koda bi trebala da izgleda ovako:
Code:
<?php
if(isset($_POST['formpass']) && isset($_POST['formlogin']))
if(proveraKorisnika($_POST['formpass'], $_POST['formlogin'])){
$_SESSION['logged_in'] = true;
header("Location: fajl_sa_porukom_o_uspesnom_logovanju.php");
} else
$_SESSION['logged_in'] = false;
}
?>
<!-- Ovde ide forma ciji action atribut ukazuje na ovu stranicu (stranicu gde se nalazi forma) -->
Ovo je samo generalna koncepcija.
I za kraj... Izraz
Code:
if ($formpass == $pass && $formlogin == $username)
je ispravan jer operacija komparacije
== ima prednost nad operacijom logičko ILI
& ali je uvek dobra paksa delove odvajati dodatnim zagradama čak i kada to nije potrebno.
Evo primera radi jedne kompletne liste operatora koji se koriste u PHP-u sa njihovim prioritetom.
http://www.php.net/operators
[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:36 GMT+1]
[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:37 GMT+1]
[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:40 GMT+1]
[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:41 GMT+1]