ugrás a tartalomhoz

PHP login - Ez a megoldás helyes?

norby1 · 2010. Május. 19. (Sze), 20.18
Sziasztok!

Egy oldalt készítek, ahol bizonyos tartalmak elérése csak regisztráció/bejelentkezés után lehetséges. Ha valaki ugye nincs bejelentkezve, akkor az oldalon nem jelennek meg olyan elemek sem, hogy pl. hozzászólás beküldése, saját profil szerkesztés stb.

Ez jelenleg a következőképpen van megoldva, és működik:
Sikeres bejelentkezés után az index.php fájl elején egy változó ($jogosultsag) kap egy logikai értéket, és az oldal további betöltődése során e változó értékét figyelembe véve töltődik be a tartalom.
pl. if($jogosultság == 1) include('vedett_tartalom.php');

Ez mennyire szerencsés megoldás? Biztonság és működés szempontjából?
Ti is hasonlóképp csinálnátok? Nem akarnék hibás megoldást alkalmazni/megtanulni.

(Remélem érthető a megfogalmazásom.)
 
1

attol függ

neogee · 2010. Május. 20. (Cs), 05.35
Szia!
Nos a biztonsági szempontot vizsgálva attól függ, hogy a változódba honnan, és hogyan kerül bele az a logikai érték. :) ami egyébként a példában egész :) és persze attól is függ, hogy mennyire van védve az a védett tartalom. ez alatt azt értem, hogy megfelelő mennyiségű okoskodás után, hozzá lehet e valamiképpen férni a 'vedett_tartalom.php'-hoz, vagy esetleg .htaccess-el le van tiltva a hozzáférés :)
2

Elvileg nem lehet hozzáférni kívülről

norby1 · 2010. Május. 20. (Cs), 09.21
A védett tartalomhoz elvileg nem lehet hozzáférni úgy, hogy valaki közvetlenül hivatkozik rá: http://www.valami.hu/php_inc/cikk/vedett_tartalom.php
A vedett fájl(ok) legelején megvizsgálom, hogy valóban az index.php akarja-e beinkludolni, ha nem akkor hibaüzenet.

E link leírás alapján írom a kódot. Bejelentkezés után ellenőrzöm az adatbázisban, hogy regisztrált-e, vagy az előző bejelentkezése óta nincs-e még lejárva a session_id-je. Ha létezik és nincs lejárva, akkor: $jogosultsag=1, különben $jogosultsag=0;

Utána csak erre a változóra alapozom az oldal további betöltődését.
3

egyszerű megoldás

neogee · 2010. Május. 20. (Cs), 20.08
Ez egy meglehetősen egyszerű megoldás :) ennél lehet azért jóval bonyolultabbakat irni. :) De ha a célnak megfelel, akkor elvileg olyan nagy gondot én személy szerint nem látok vele... :) De egyébként az alapelv tulajdonképpen minden rendszer esetében ez. :)
4

Köszönöm

norby1 · 2010. Május. 20. (Cs), 20.23
Köszönöm a válaszod. Igen, nekem is elég egyszerűnek tűnik,de egyelőre működik szépen :)
5

Leírnád nekem?

makezdtem · 2011. Már. 17. (Cs), 17.00
Leírnád nekem hogy csináltál ilyet az elejétől a végéig mert én is szeretnék egy ilyet csak nem tom, hogy hol kezdjek hozzá!
Még nem tanultam php-t! :S
6

Elkezdeni

Poetro · 2011. Már. 17. (Cs), 17.12
Akkor ideje elkezdeni. Rengeteg könyv, blog, leírás szól arról, hogyan érdemes megtanulni a PHP-t.
7

hello!!

kriszrap · 2011. Már. 18. (P), 00.07
én ajánlanék egy videot innen tanultam meg ezt a php beléptetős dolgot:)

http://videosmart.hu/video/hogyan-keszitsunk-adatbazis-alapu-belepteto-php-scriptet-1-resz

2. vidi
http://videosmart.hu/video/hogyan-keszitsunk-adatbazis-alapu-belepteto-php-scriptet-2-resz
8

Hiányos

janoszen · 2011. Már. 18. (P), 00.14
A videó készítőjének a (PHP) tudása minimum hiányos, ha lehet, akkor talán inkább ne ebből tanuljunk.

Hibalista:

  • A PHP tömbindexeket macskakörmök között illik megadni, ez esetben egy NOTICE szintű hibát fog okozni. Banális hiba, de ha bekapcsolod a noticeokat, akkor a PHP ki fogja írni azokat a problémákat, amik programozási bakikra utalhatnak.
  • A felhasználótól kapott felhasználónév és jelszó mindenféle escapelés nélkül van az SQL parancsba szúrva, ezért az SQL injection sebezhetőséghez vezethet.
  • A jelszavak plain textben vannak tárolva, tehát ha SQL injectionhöz jutunk, amivel ki lehet íratni az adatokat, akkor gyakorlatilag a teljes felhasználói adatbázis kinyerhető különösebb erőlködés nélkül. A jelenleg ajánlott módszer a sózás+hashelés.
  • A programban semmiféle hibakezelés nincs, tehát ha nem sikerült csatlakozni az adatbázishoz, akkor is ész nélkül megpróbálja végigtolni a programot.
9

Végülis nem rossz megoldás

inf3rno · 2011. Már. 18. (P), 03.33
A jogosultságoknál arról van szó, hogy vannak jogcsoportok.

Amikor valaki felmegy az oldaladra, akkor 0-ás jogcsoportba kerül bele. Amikor belép, akkor 1-es jogcsoportot kap, amikor mondjuk egy admin lép be, akkor 1-es és 2-es jogcsoportokat kap.

A jogcsoportok kiegészíthetik egymást. Mondjuk van a beloginolt emberke az alapfunkciókkal, és van az admin a bővített funkciókkal, amikhez hozzátartoznak az alap funkciók. Szóval általános esetben nem feltétlen jó csak egy csoportot megadni, ahogy te teszed azzal az egyetlen számmal.

Annyiból jó a megoldás, hogy ez a szám felhasználható extra információ hordozásra. Ez történhet binárisan:

bin(01)=1 //logged
bin(10)=2 //admin
bin(11)=3 //admin+logged
vagy ha kevés csoport szinteződik egymásra elágazás nélkül, akkor mehet feltétellel is:

$permission>1 //admin
$permission>0 //logged+admin
A Controller-ek hívását (vagy nálad az include-ot) az adott csoportba való tartozás határozza meg. Bonyolultabb rendszereknél fel szokták sorolni a csoportok jogait, a legegyszerűbb megoldás erre, ha felsorolja az ember az összes Controller-t, aztán kiválogatja, hogy melyik csoport milyen Controller-eket hívhat meg, a session-ben meg összegzed a felhasználó csoportjaihoz tartozó Controller-eket egy tömbbe, és abból keresed ki, hogy az éppen hívott Controller ott van/nincs ott. Ezt persze lehet tovább bonyolítani, amikor a Controller-re és action-re is ellenőrzöl, vagy ha beteszel egyedi módosítókat az egyes felhasználókhoz, és így tovább.

A hátránya az a te módszerednek, hogy az egyes csoportoknak nincsen nevük. Szóval mondjuk ha már bejönnek mondjuk admin jogok, akkor érdemes ezeket a számokat kitenni konstansokba, és úgy ellenőrizni.

$permission==PERMISSIONS_ADMIN //admin
$permission!=PERMISSIONS_UNAUTHORIZED //admin+logged
Ez átláthatóbb kódot eredményez.

Ha több csoport jön be, és a csoportok egymástól függetlenek, akkor érdemes váltani a bináris formára, ha meg már tényleg nagyon sok a csoport vagy egyedi jogokat akarsz minden felhasználónak, akkor meg a felsorolásos formára.

A front controller-es megoldás jó, az gyakorlatilag kötelező a jogok kezelésénél, ha szétszórva lennének az egyes fájlokban a jogokat ellenőrző kódok, az elég komoly hibákhoz vezethetne. Mindenképp érdemes valamilyen központi ellenőrzővel végeztetni a jogok ellenőrzését úgy, hogy ez a központi ellenőrző végezze nálad az includot is. Mondjuk csinálsz egy olyan függvényt, hogy include_if_possible, ami ellenőrzi a jogokat, és utána beszúrja az adott fájlt. Így egy helyen lesz az összes jogosultság ellenőrző kódod. Ezen a helyen elvégezheted a fájlnév alapján központosítva a jogosultság ellenőrzést, nem pedig úgy, hogy minden egyes include elé beteszel egy if-et. Ha kimarad egy if egy include elől, akkor feltörik az oldalad, ha kimarad egy fájlnév a hozzáférhető fájlok listájáról, akkor nem tudsz végrehajtani egy feladatot. Talán érzed a különbséget...