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:

<?php
		$keres = "SELECT * FROM `admin` WHERE nev='$adnev'";
		$eredmeny = mysql_query ($keres, $kapcsolat) or die ("HIBA" .mysql_error());
		$sor = mysql_fetch_assoc ($eredmeny);
		$pass = crypt ($adpass, $sor[jelszo]);
		if (empty ($sor))
			{
			print "Nincs ilyen admin!";
			}
		if ($sor[jelszo] == $pass)
			{
			header ("Location: index2.php?". SID);
			print "Bejelentkezés sikeres!";
			$belepett = true;
			session_register ("adnev");
			session_register ("adpass");
			session_register ("belepett");
			exit;
			}
?>
Az oldalak védelméhez, minden egyes aloldalra behívok egy filet, ami tartalmazza a következő sorokat:

<?php
session_start();
extract ($_SESSION);
$keres = "SELECT * FROM `admin` WHERE nev='$adnev'";
$eredmeny = mysql_query ($keres, $kapcsolat) or die ("HIBA" .mysql_error());
$sor = mysql_fetch_assoc ($eredmeny);
if (empty ($sor))
	{
	header ("Location: index.php");
	exit;
	}

if ($belepett == false)
	{
	header ("Location: index.php");
	exit;
	}
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).

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

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

$eredmeny = mysql_query ($keres, $kapcsolat) or die ("HIBA" .mysql_error());
if ($belepett == false || mysql_num_rows($eredmeny) <= 0 )
    {
    header ("Location: index.php");
    exit;
    }
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." )