ugrás a tartalomhoz

Biztonságos-e a bejelentkeztető felületem?

kiss_david1 · 2007. Már. 18. (V), 21.38
Előre is bocsánatot kérek ha már van ilyen téma.
Nos, nekem csak egy ellenőrzés kéne, hogy megfelelő biztonsággal van-e ellátva az oldalam admin részének biztonsága.
A bejelentkező felületnél, a megfelelő ellenőrzések után, bejegyzem az adatokat a munkamenethez:
  1. <?php  
  2.         $keres = "SELECT * FROM `admin` WHERE nev='$adnev'";  
  3.         $eredmeny = mysql_query ($keres$kapcsolator die ("HIBA" .mysql_error());  
  4.         $sor = mysql_fetch_assoc ($eredmeny);  
  5.         $pass = crypt ($adpass$sor[jelszo]);  
  6.         if (emptyempty ($sor))  
  7.             {  
  8.             print "Nincs ilyen admin!";  
  9.             }  
  10.         if ($sor[jelszo] == $pass)  
  11.             {  
  12.             header ("Location: index2.php?". SID);  
  13.             print "Bejelentkezés sikeres!";  
  14.             $belepett = true;  
  15.             session_register ("adnev");  
  16.             session_register ("adpass");  
  17.             session_register ("belepett");  
  18.             exit;  
  19.             }  
  20. ?>  
Az oldalak védelméhez, minden egyes aloldalra behívok egy filet, ami tartalmazza a következő sorokat:
  1. <?php  
  2. session_start();  
  3. extract ($_SESSION);  
  4. $keres = "SELECT * FROM `admin` WHERE nev='$adnev'";  
  5. $eredmeny = mysql_query ($keres$kapcsolator die ("HIBA" .mysql_error());  
  6. $sor = mysql_fetch_assoc ($eredmeny);  
  7. if (emptyempty ($sor))  
  8.     {  
  9.     header ("Location: index.php");  
  10.     exit;  
  11.     }  
  12.   
  13. if ($belepett == false)  
  14.     {  
  15.     header ("Location: index.php");  
  16.     exit;  
  17.     }  
Ez a beléptetés megfelelő biztonságot nyújt vagy könnyen feltörhető?

Még ezen kívül annyi lenne a problémám, hogy hiába írom be a .SID-et átirányításnál nem írja ki a cím után. Mi lehet ezzel a probléma vagy működik a script ez nélkül is?

Előre is köszi a segítséget!
Kiss Dávid
 
1

SQL injection veszély

w3net · 2007. Már. 19. (H), 09.38
Sajnos nem vagyok meggyőződve arról, hogy helyesen csinálod.
Első kérdésem az lenne, honnan jön az az $adnev változó (a login oldalon)?
Gondolom ez a $_POST változóból jön.
Mit kezdesz a magic_quotes problémával? Mindig ki van kapcsolva, vagy minden esetben be van? Ha a magic_quotes ki van kapcsolva, akkor a kódot így ebben a formában egyáltalán nem biztonságos (példa SQL injection sebezhetőségre).
Egy jó tanács: a magic_quotes nem jó dolog, azt le kell tiltani.
Ha letiltottad, akkor neked kell a változókat eszképelni (ha szükséges).
SQL utasitásokban a mysql_real_escape_string használata az ajánlott (feltéve, ha MySQL adatbázist használsz).
  1. $keres = 'SELECT * FROM admin WHERE nev=\''. mysql_real_escape_string($adnev) .'\'';  
Megjegyzés:
Honnan szeditek ezt a baromságot? Már több helyen is láttam ilyet.
  1. extract ($_SESSION);  
Ezt valami könyvben olvastad? Nagyon nem jó praktika az ilyesmi.
3

régi programok

pp · 2007. Már. 19. (H), 10.50
Honnan szeditek ezt a baromságot? Már több helyen is láttam ilyet.


Ez egy jó megoldás lehet egy régi PHP-s alkalmazásnál, ami a register_global=on beállítással jól és megbízhatóan működött.

Új programban egyértelműen életveszélyes, de pl. aki a "PHP 24 óra alatt" c. könyvből tanul annál ez életmentő, hisz nem tud szinte egyetlen egy mintaprogramot sem kipróbálni e nélkül. Szóval nem baromság ez, de nem is jó praktika. ;)

A topic indítójának tudom ajánlani biztonság szempontjából a WFSZ ajánlását.


pp
2

Nagyjából...

TeeCee · 2007. Már. 19. (H), 09.56
... rendben van.

De:
- Nem szokás már a session_register()-t használni. Használd csak a $_SESSION tömböt! A PHP.net szerint ( http://hu2.php.net/session_register ) sem jó keverni...
- A $keres = "SELECT * FROM `admin` WHERE nev='$adnev'"; előtt az $adnev-et ugye átnyomod egy mysql_real_escape()-függvényen? Ajánlott irodalom: ( http://weblabor.hu/blogmarkok/17214 (SQL Injection Cheet Sheet) )
- A $_SESSION['adpass']-t nem szabad session-ban tárolni (már ha tényleg az admin jelszó van benne)! A default hely a session-ok tárolására a /tmp, azt általában bárki írhatja, olvashatja... és mi lehet vele, ha elolvassák?...
- Szerintem az oldalaknál fölösleges a MySQL-kérés. Ha van $_SESSION['adnev'], akkor be van jelentkezve. Persze lehet mondjuk egy 'checksum' mezőt bevezetni és az md5($adname.$_SERVER['REMOTE_ADDR'])-t eltárolni benne, azt is össze tudod vetni és akkor nem csak a név, hanem az IP is ellenőrzésre kerül...
- A $_SESSION['belepett']-et fölöslegesen tárolod. Egyszerűen kideríthatő, hogy belépett-e:

funcion belepett() {
return ( !empty(@$_SESSION['adnev']) );
}
A végére kikapcsolódásképpen egy kis rövidítés (ha máshol kellene ilyen):
  1. $eredmeny = mysql_query ($keres$kapcsolator die ("HIBA" .mysql_error());  
  2. if ($belepett == false || mysql_num_rows($eredmeny) <= 0 )  
  3.     {  
  4.     header ("Location: index.php");  
  5.     exit;  
  6.     }  
4

hóhér akasztása ;)

Hodicska Gergely · 2007. Már. 19. (H), 14.48
Nagyjából...rendben van.
Alapvető és komoly hiba van benne: bejelentkezéskor új session ID-t kell kiosztani, különben a session fixation módszerével támadható az oldal:
http://weblabor.hu/cikkek/munkamenetkezeles2
Kérdezőnek ez is ajánlott lehet:
http://weblabor.hu/cikkek/munkamenetkezeles1

return ( !empty(@$_SESSION['adnev']) );
Az empty függvény nem NOTICE-ol, fölösleges a @.


Üdv,
Felhő
5

Én, mint hóhér?...

TeeCee · 2007. Már. 19. (H), 15.59
... az vicczes lenne ;)

A felsorolt lista alapján reméltem, hogy a "nagyjából"-ban érezhető némi irónia.
A session fixation-ban igazad van az kimaradt. Elküldhettem volna én is a cikkedhez...

Azt, hogy az empty nem notice-ol, azt nem tudtam - de most már igen :)
( http://hu2.php.net/empty és tényleg: "empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set." )