$_SESSION Igy mennyire biztonságos?

$_SESSION Igy mennyire biztonságos?
2021-11-04T15:48:51+01:00
2021-11-04T22:36:24+01:00
2022-10-15T21:20:34+02:00
kviktor12340
Sziasztok, egy olyan kérdéssel fordulnék felétek hogy szerintetek ez a megoldás igy mennyire biztonságos? Egy admin felületről lenne szó ahová szeretném ezt a módszert alkalmazni. (Lehetséges, hogy volt már  ilyen kérdés de átlagosan azok már elég régiek, azóta eltelt már pár PHP verzió és igy 2021 ben lehetnek már akár új biztonsági rések is)

Szóval előszöris van egy táblázat amiben szerepelnek a belépési adatok:
id, name, password, created_at

A jelszó a táblázatban password_hash-al lett beszúrva.

password_hash($password, PASSWORD_DEFAULT);
A bejelentkezésnél PDO-t használok természetesen.

Sikeres bejelentkezésnél pedig:

$_SESSION["loggedin"] = true; $_SESSION["id"] = $id; $_SESSION["username"] = $username; $_SESSION['LAST_ACTIVITY'] = time();
Na most pedig a fontos része. A index.php-n igy történik a $_SESSION ellenőrzése:

if (!isset($_SESSION)){ session_start(); } $url = dirname($_SERVER['PHP_SELF']); if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true || empty($_SESSION["username"])){ header("location: login.php?url=".$url); exit; } //Ha 30 perc eltelt a $_SESSION létrehozás óta. if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) { session_unset(); session_destroy(); header("location: login.php?url=".$url); exit; } $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp ....JÖHET A TARTALOM....
+ Egy kis biztonságot adva hozzá ami include() a index.php-n ott:

if (basename($_SERVER['SCRIPT_FILENAME']) != 'index.php') die('A hozzáférés megtagadva.');

A többi .php fájnál amit nem kértem ( include() ) a index.php-hez ott azt a módszert használom amit a index.php fájl tetején. Azaz ha nem üres a $_SESSION["loggedin"] akkor mehet tovább.

Ez igy szerintetek mennyire biztonságos? 
Köszönöm mindenkinek előre is!
Mutasd a teljes hozzászólást!
Szerintem ez PHP oldalon majdnem elfogadható. Pár plusz dologgal egészíteném ki:
1) SSL kapcsolat, hogy titkosítva legyen a kommunikáció a kliens és a szerver közt, mivel a session ID érzékeny adat.
2) Én személy szerint nem használnám PASSWORD_DEFAULT-ot a password_hash-ben. Inkább konkrétan leírnám a titkosító algoritmust, amit használni szeretnék, nehogy az legyen, hogy a PHP egy jövőbeli verziójában úgy döntenek, hogy a default módszert megváltoztatják, és egy PHP verziófrissítéssel eltörik a bejelentkezés funkció. Persze ez csak paranoia a részemről.
3) Az adatbázisban a jelszó mellé én eltárolnám azt is, hogy milyen módszerrel titkosítottam. Történhet ugyanis az a jelenség, ami pár évvel ezelőtt az SHA1 esetében, hogy kiderült, a módszernek van sebezhetősége (mily meglepő). Ha tudod azt, hogy mivel titkosítottad, tudod ellenőrizni majd a jövőben azt is a következő bejelentkezéskor, hogy kell-e újratitkosítanod a jelszót egy biztonságosabb módszerre.
4) Bejelentkezéskor MFA. Küldj egy egyszer használatos kódot az e-mail címére például.

Amivel ez a módszer támadható:
1) Session hijacking. Vagyis valakinek sikerül lehallgatnia a session azonosítót, és azzal a támadó más neve alatt tud tevékenykedni a rendszerben.
2) A felhasználó figyelmetlensége - például kap egy adathalász e-mailt a te oldalad nevében, hogy sürgősen meg kell változtatnia a jelszavát.
3) Brute force vagy szivárványtáblás támadás - ez ellen könnyű védekezned, ugyanis az adatbázisban tárolhatod, hogy az adott user hányszor próbálkozott rossz jelszóval, és tilthatod X ideig a fiókját.

A módszernek egy hátránya van, mégpedig az, hogy nem skálázható horizontálisan. Tehát ha megnő az oldalad terheltsége, kicsit nehezebb dolgod lesz, ha egy második szervert is csatasorba akarsz állítani - ugyanis ha az A szerveren jelentkezik be, de a következő requestet a B szerverre küldi a load balancer, akkor a B szerver nem fog tudni arról, hogy be van jelentkezve. Ezt persze meg lehet oldani a load balanceren az ún. sticky session-ök bekapcsolásával, vagy tanulhatsz egy kicsit a JWT tokenekről.
Mutasd a teljes hozzászólást!

  • Szia, köszönöm szépen a válaszod, pontosan ilyen biztonsági ötletekre voltam kivancsi amit nagyon jól kifejtettél!:) Köszönöm mégegyszer!
    Mutasd a teljes hozzászólást!
  • Valamiért van az az érzésem, hogy sötét felhők gyülekeznek a fejem fölött az előző válaszomért. Főleg azért, hogy olyat merészeltem mondani, hogy ez a megoldás elég jó, miközben az informatikában sosem lehetnek az adatok eléggé biztonságban.

    Nos, ez igaz is. Minden feltörhető. Sokkal inkább az a kérdés, hogy mekkora értéket kell védenünk - ez alapján tervezzük meg a rendszerünk biztonságát.

    Egyrészt a te szoftvered csak egy láncszem a történetben. Feltörhetik az adatbázis-szervert, feltörhetik a szoftveredet futtató operációs rendszert, támadhatják a hálózati infrastruktúrát, indíthatnak túlterheléses támadást, kihasználhatják a felhasználóid figyelmetlenségét, van sebezhetőség magában a PHP-ban, stb.

    Ha csak a te szoftveredre korlátozzuk a szemléletünket, akkor olyan biztonsági mechanizmust kell implementálnunk, hogy a szoftverünket közvetlenül érő támadásnak végső soron nagyobb költsége legyen, mint a védett adat értéke. Ha milliók-milliárdok, emberi életek múlnak a rendszer biztonságán, akkor remélhetőleg nem te, és nem is én leszek az, aki azt meg fogja tervezni, hanem lesz egy igen nagy tapasztalattal és gyakorlati tudással rendelkező security architect, aki tudja, mi fán terem a hatékony védekezés. De mivel egy tanuló- vagy hobbiprojektről van szó, ami nem tárol túl értékes információkat, arra ez a megoldás bőven elegendő, azt gondolom.
    Mutasd a teljes hozzászólást!
  • Teljesen egyet ertek veled, igazabol mindig van aki csak “kritizálni” tud es neki semmi sem eleg jo. Ezert megis lepodtem amikor olvastam a valaszodat es normalisan leirtad, hogy te mit gondolsz a kodrol illetve milyen sebezhetosegeket latsz benne. Es ez szerintem igy van rendben. Foleg a Facebookon latni olyanokat, hogy a kezdok szeretnenek kerdezni valamit es egybol megy a kritizalas (mas szoval megmondjak neki hogy inkabb keressen mas szakmat) es nem pedig kifejtik hogy mi a gond a kodban es mi lenne ra a megoldas. 



    Pedig mindenki volt kezdo es biztos vagyok benne, hogy mindenkinek volt olyan helyzetje hogy vagy 
    a, nemvolt benne biztos hogy jol van ez igy megha mukodott is (pl. az en helyzetem)
    b, nem mukodott es nemtalalt ra valaszt, hogy miert nem

    De tenyleg oszinten jo latni, hogy meg vannak itt segito emberek :)

    U.i.: Bocsi az offert
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd