Session biztonsági ellenőrzés
Sziasztok! Adott egy weboldal, amin eddig úgy ment a felhasználók session adatainak ellenőrzése, hogy a felhasználó nevét, aktivitását stb. ellenőriztem, azonban minden különálló oldalon ugyanolyan módon, az oldal elejére beillesztve a kódot. Mivel szeretném áttekinthetőbbé tenni az oldalak kódját, ezért arra gondoltam, hogy kiraknám egy külső fájlba a webrooton kívül, ahonnan a phpval require_once beolvasnám és funkcióként minden oldal elejére helyezném. Két dolog jutott eszembe:
Mi van, ha nem létezik a bekért include? Ekkor automatikusan leáll a php fordítása fatális hibával már a kód elején, tovább nem lehet használni.
Mi van, ha nem létezik a szükséges function? Ebben az esetben szintén fatális hibával le fog állni a php fordító, tovább az oldal nem használható.
A require_once esetében kézzel (saját kódon belül, nem felhasználói input) felvitt útvonallal adom meg a biztonsági ellenőrzést végző függvény fájlját.
Okoz-e biztonsági problémát ez, mire kell figyelnem ezeken kívül?
illetve
Kevésbé lesz-e biztonságos a weboldal, ha ilyen módon történik a felhasználók jogosultság vizsgálata ahelyett, hogy minden oldal elején ugyanaz a kód szerepelne? A function sessiont vizsgál, amit eddig minden oldal eleje tett meg.
Köszönöm a segítséget!
■ Mi van, ha nem létezik a bekért include? Ekkor automatikusan leáll a php fordítása fatális hibával már a kód elején, tovább nem lehet használni.
Mi van, ha nem létezik a szükséges function? Ebben az esetben szintén fatális hibával le fog állni a php fordító, tovább az oldal nem használható.
A require_once esetében kézzel (saját kódon belül, nem felhasználói input) felvitt útvonallal adom meg a biztonsági ellenőrzést végző függvény fájlját.
Okoz-e biztonsági problémát ez, mire kell figyelnem ezeken kívül?
illetve
Kevésbé lesz-e biztonságos a weboldal, ha ilyen módon történik a felhasználók jogosultság vizsgálata ahelyett, hogy minden oldal elején ugyanaz a kód szerepelne? A function sessiont vizsgál, amit eddig minden oldal eleje tett meg.
Köszönöm a segítséget!
Forditva
Nem pontosan értem, hogy mire
Igen
janoszen +1; Az OOP az jó, az
Én keresnék a helyedben valami egyszerű keretrendszert (pl. Laravel vagy hasonló), amivel csinálnék egy hello worldöt, illetve kipróbálnék egy auth komponenst. Ez kb rá fog vezetni egy jó megoldásra.
Ettől még lesz kód duplikáció sajnos. Leszármaztatással jobban jársz. Egyszer egy keleti sráccal dolgoztam, és megkértem, hogy figyeljen a kód duplikációkra, mert rengeteg helyen előfordul ugyanaz az X sor kód. Erre ő azt válaszolta, hogy:
"Ok, akkor ezentúl minden módosítás után mindig gondoskodom róla, hogy a módosított kódot mindenhova átmásoljam!" > szerintem ne így állj neki :)
Mi van, ha nem létezik a szükséges function? Ebben az esetben szintén fatális hibával le fog állni a php fordító, tovább az oldal nem használható.
A require_once esetében kézzel (saját kódon belül, nem felhasználói input) felvitt útvonallal adom meg a biztonsági ellenőrzést végző függvény fájlját.
Tudsz példát mutatni? Nem világos pontosan, hogy hogyan küzdesz.
A nagy probléma az, hogy évek
"Tudsz példát mutatni? Nem világos pontosan, hogy hogyan küzdesz."
Oldal eleje például:
Ha valamilyen okból kifolyólag megszűnne létezni a function_lista.php, akkor a php elvileg fatális hibával leáll és nem fordul tovább, tehát hiába nem létezik a fájl, az oldal többi részének adatai nem lesznek elérhetőek.
Esetleg, ha a function nem létezne:
{
biztosagi_session_ellenorzes();
} else
{
session_start();
session_unset();
session_destroy();
header("location: login.php");
exit;
}
Mivel szeretek minden eshetőségre felkészülni, ezért az esetleg a nem létező function esetén is biztosítottam magamat ezzel a kóddal. Természetesen maga az ellenőrzés indítja a sessiont és jogosulatlan használat esetén hasonlóan jár el.
Eddig minden oldal elején volt megtalálható a körülbelül 300 sornyi biztonsági ellenőrzés, kezdve a session adatok vizsgálatával és hasonlókkal. Attól, hogy én ezt egy külső function_lista.php fájlba szerveztem, más biztonsági kockázata remélem nincs azokon kívül, amiket leírtam. A session változó globálisan elérhető, functionon belül is tudom vizsgálni szerencsére.
Van aminek a létezését
Egyszerű lesz a példa:
A te problémádra ne alkalmazás szinten keresd a megoldást, hanem tervezés és megvalósítás szinten.
Szervezés és tervezés
Ha évek alatt procedurális rémálmot sikerült összehoznod, akkor feltételezhető, hogy a váltás után OOP rémálom lesz belőle.
Először inkább programozni kéne megtanulnod, meg hogy hogyan kell a kódot szervezni. Érdemes átgondolni, mi történik az egyes oldalakon: felhasználó azonosítása -> bejövő adatok ellenőrzése -> akció lefuttatása -> kimenő adatok (pl. HTML) legenerálása és kiküldése.
Az összes weboldal és webes alkalmazás ráhúzható erre a sablonra, ami, ha belegondolsz, egyszerű cselekmények láncolata, azaz procedurális. Ezekből készíthetsz nagy függvényeket, amik kisebbeket hívnak.
A programod attól nem lesz
Kivételesen egyetértek.... Végülis nem is csak az idézettel, hanem az egésszel :).
Azt viszont hozzátenném, hogy az OOP ismerete és megfelelő használata megkönnyíti az egységbezárást és a hibakeresést, hibajavítást. Hangsúlyozom a MEGFELELŐ szót. Erre ha rájön egy jól megtervezett keretrendszer ismerete, akkor az eléd rakhat egy rakat tervezési mintát is és best practice-t, amiket hosszú távon érdemes alkalmazni.
Elmaradt döntések
Ezalatt az idő alatt rengeteg döntést meg kell hoznod előre, mint pl:
- Mik az alapvető működéshez elengedhetetlen funkciók
- Ezeket milyen kisebb részekre érdemes bontani
- Ezek közül mik globálisak (minden, vagy csaknem minden funkció / oldal működéséhez szükségesek)
- Melyek azok, amik szintén sűrűn használatosak, de pl nagy erőforrásigényűek, emiatt csak akkor kéne elérhetőnek lenniük, ha adott feltétel teljesül
- Mindezt milyen szervezési struktúrában kívánod megvalósítani.
..., akkor Hídvégi Gábor "AntiOOP specialista" készséggel fog neked segíteni.
Viccet félretéve: az objektumorientált programozás nem valamiféle csodaszer, ami képes pótolni pl a rendszerszemlélet hiányát, vagy a kódszervezésben való járatlanságot.
Gábornak ebben teljesen igazat adok: ha procedurálisan is egy nagy katyvasz, akkor "OOP-ben" is az lesz, csak a fájlok így fognak kezdődni:
class Valami { ...
.NEM ez az OOP. Nem pusztán "classok gyűjteménye".
Mostani helyzetedben a legfontosabb döntés, hogy - attól függően, mennyire tudsz azonosulni a szemlélettel - a nagyon nagy refact után procedurális lesz-e az eredmény, vagy valamennyire OOP. Látatlanban is azt mondom, hogy nagyjából ugyanannyi munkára számíts.
A fő lényeg az, hogy lehetőség szerint az összes kód-duplikációt szüntesd meg.
Hibái:
- Relatív path. Ha az a fájl, "aki" behúzza, vagy a
function_lista.php
máshova kerül, rögtön meghal.- Nem 128 db különálló kis scriptbe kell behúzni mindig ugyanazt, hanem az egész fölé kell tenni egy root réteget, ami betölti, esetleg futtatja is az állandóan kellő részeket.
Amit Janoszen írt, az mindenképp hasznos megoldás. Kicsit kibontva, átértelmezve:
- Legfontosabb, hogy minden egyes HTTP kérés az index.php - t indítsa el (Apache / Nginx conf)
- index.php - d kb max 50 sornyi, elvégzi a routing-ot, betölti, amiket mindig kell.
- Ezután betölti, ami az adott oldal specifikus kódja (routing alapján persze).
- Ha procedurális / strukturált megoldáson gondolkodsz, akkor is felveszi konstansokba a fontosabb könyvtárakat (abszolút path), amikkel a kis scriptek könnyen intézhetik majd a helyi betöltéseket (fájlkezelésekhez is jól jön).
- Ha procedurális, akkor egy megfelelő gyűjtőhelyre mehetnek a funkciók, innentől már a te szervezőkészségeden múlik, hogy ne duplikálj kódot.
Mindkét esetben fontos, hogy okosan nevezd el az egyes feature-öket, fájl- és class- (függvény-) név beszédesen mondja el, hogy mit is fog csinálni.
A másik nagyon fontos dolog, hogy egy metódus egyetlen dolgot csináljon.
Ez kb azt jelenti, hogy egy max 5 szavas tőmondatban le tudod írni a teljes működését. (És ez nem az például, hogy "Mindent intéz, ami autentikáció" :) )
Smokey 5-ös válaszában írt auth függvénye nagyon jó példa a helytelen beágyazásra. Ahelyett, hogy autentikálná a látogatót, próbál loaderként működni, de közben ha sikertelen a tényleges autentikáció betöltése, akkor azt az esetet is próbálja valahogy lekezelni, pedig köze sincs az eredeti (auth) feladathoz.
Nos, pont így lehet borzasztó kesze-kusza spagettikódot gyártani, amiben mindig fog maradni jónéhány kezeletlen kivétel, emellett rendkívül átláthatatlan lesz, megőszülsz, mire végigmész egy láncon..
(Smokey bocsi, nem szekálni akartalak, de szerintem iskolapélda, hogyan rejtsem el magam elől a működést.)
Köszönöm az útmutatást és a
Mutass több kódot
(Ugyanez igaz a nemlétező fájl require / include - ra, az nem a php hibája, vagy szerinted ilyen esetben "neki" kéne legyártani / más helyen keresni a rosszul megadott útvanalat? :) )