PHP és biztonság ( :-) )
Tudom, antagonisztikus ellentét, de... :-)
Azon gondolkodtam, hogy ha végre eljutok odáig, hogy összerakjak egy működő lapot, akkor az nem egyetlen file-ból fog állni. Ezen file-ok egy része (elméletileg) tartalmazhat olyan kódot, aminek a végrehajtása jogosultsághoz kötött.
Ilyenkor mi a korrekt módszer?
Minden egyes file elejére tegyem be az ellenőrzést, akkor is, ha az őt hívó oldal egyébként elvégzi? Kicsit túlzásnak érzem.
Mennyire gázos/hibás/stb. az az elképzelés, hogy a site gyökérkönyvtárában lévő valamennyi lap végez ellenőrzést, az alkönyvtárakban (mondjuk ilyenek, mint lib/, classes/ stb.) lévők nem, viszont... a .htaccess-be teszek egy RewriteRule-t, amivel ezen könyvtárakba irányuló kéréseket átirányítom a főoldalra, hibára stb.
Az include/require nem megy át a rewrite-on, tehát működőképes marad a program, viszont ha valaki bele akar nézni ezekbe a file-okba/futtatni próbálja őket, akkor kapásból átirányítom egy semleges oldalra.
■ Azon gondolkodtam, hogy ha végre eljutok odáig, hogy összerakjak egy működő lapot, akkor az nem egyetlen file-ból fog állni. Ezen file-ok egy része (elméletileg) tartalmazhat olyan kódot, aminek a végrehajtása jogosultsághoz kötött.
Ilyenkor mi a korrekt módszer?
Minden egyes file elejére tegyem be az ellenőrzést, akkor is, ha az őt hívó oldal egyébként elvégzi? Kicsit túlzásnak érzem.
Mennyire gázos/hibás/stb. az az elképzelés, hogy a site gyökérkönyvtárában lévő valamennyi lap végez ellenőrzést, az alkönyvtárakban (mondjuk ilyenek, mint lib/, classes/ stb.) lévők nem, viszont... a .htaccess-be teszek egy RewriteRule-t, amivel ezen könyvtárakba irányuló kéréseket átirányítom a főoldalra, hibára stb.
Az include/require nem megy át a rewrite-on, tehát működőképes marad a program, viszont ha valaki bele akar nézni ezekbe a file-okba/futtatni próbálja őket, akkor kapásból átirányítom egy semleges oldalra.
Függvények
index.php
-t kivéve csak osztályok illetve függvények legyenek, és akkor nincs semmi, amihez hozzá tudna férni. Ez alól kivételt képezhetnek a konfigurációs fájlok, amik ugye nem írnak ki semmit, illetve a template fájlok, amik ugye adatok hiányában nem fognak értelmezhető eredményt produkálni.Nem akarok kötekedni, de...
Igaz, ott minden lap ellenőriz, amibe belenéztem.
Mondjuk, amíg saját szerveren fut a cuccom, addig nincs gond, mert kirakom az egyéb file-okat oda, ahol a webről nem lehet közvetlenül elérni őket. Gond az ingyenes tárhelyeken lehet belőle, mert ott meg van kötve az ember keze, ami a könyvtárstruktúra kialakítását illeti.
Végülis ez sem rossz módszer:
Ellenpéldának?
A "csak az index.php-ben
és biztonságos alkalmazásra...
Ez mi? (azon túl, hogy egy
Asszem erre mondják...
Nem baj. Ő koptatja a
(annyit kiszedtem belőle, hogy valahova az exploit-db.com-ra vinne, de tovább nem mazsolázgattam - nem túl jó a belém programozott HTML/JS interpreter. :-) )
PhpBB exploitok
Emlékeim szerint a többi
Tényleges biztonság más téma. PHP esetében nem is számítok ilyesmire igazán. :-)
Front controller
Éppen ezért érdemes egyetlen index.php-t használni, és minden mást a docrooton kívül tartani. Projekt mérettől és bonyolultságtól függően lehet választani módszerek közt: nem mindenre a kalapács a megfelelő eszköz.
PHP esetében is lehetséges biztonságosan programozni, csak megfelelő tudás szükséges hozzá.
Rosszul emlékszel
index.php
-n a konfigurációs fájlon (settings.php
) és a template fájlokon (.tpl.php) kívül minden fájlban csak függvények vannak, 7.x-től kezdve pedig már osztályok is.Eszerint mégsem. A
A template-ekre emlékez(het)tem.
Jó, nem történik semmi, ha ezeket a template-eket direktben kérem le, de attól még ott vannak és elérhetőek, ha valaki tudja a pontos nevüket. (feltéve, hogy jó helyen néztem)
Több belépési pont
más kérdés, hogy ha sokan vagy nagyok csinálnak valamit egyféleképpen az nem feltétlenül jó még attól :)
Tárgyi tévedés
Természetesen ez a kód felépítését nem minősíti, számos jobb struktúra létezik, és a kérdezőnek is valószínűleg ajánlatosabb egy másik mintát követni, de így is lehet biztonságos programot létrehozni, és a phpBB3 egy jó példa erre.
Köszi a kiegészítést
ha teheted, akkor rakj ki az
ha nem teheted meg, akkor erdemes lehet valami a phpBB-bol linkelt megoldashoz hasonlot belerakni minden fajlba, de ahogy tobben is mar leirtak, jo esetben a template-eken es az index.php-n kivul minden mas php fajlod csak fuggveny/osztalydefiniciokat tartalmaz, emiatt az onmagukban torteno futtatasuk nem igazan okozhat barmifele kodfutast.
Tyrael
Köszi, ebben igazatok van,
Rögtön a 2.-ban írtam:
Már nem tudom, hogy mely szervereken, de több helyen is láttam olyat, hogy csak a documentroot-hoz volt hozzáférésem ftp-n keresztül. (szerintem az egyik az fw.hu lehetett, de nem biztos. Elég sokat megnéztem, de még mindig nincs olyan, ami használhatónak tűnik)
Egyelőre nehezen tudom elképzelni ezt a csak definíciókra épülő szerkezetet, ha kezelhető méretű index.php-t akarok, de lehet, hogy csak azért, mert nem rágtam át magam a dolgon, kellő alapossággal...
-----
sajnos így, hogy max. napi félórát van kedvem foglalkozni a témával, elég lassan mennek a dolgok... :(
Drupal index.php
index.php
-ja eléggé kezelhető méretű::-) Mondjuk ebben van
Mondjuk ebben van valami.
:-)
Egyébként egy szóval sem mondtam, hogy lehetetlennek tartom, csak azt, hogy én nem tudom magam elé képzelni a kivitelezését.
Persze hülyeség, mert meg is nézhettem volna valahol (pl. a drupal forrást)
De ha ez vigasztal, elsőre azt sem igazán tudtam összehozni magamban, hogy a PHP-t hogy lehet összepároztatni az objektum orientált programozással, mert objektumok kapcsán nekem egyre valami alkalmazásszerver-féleség járt az eszemben. Kicsit nehezen tudtam megemészteni, hogy egy-egy objektum életciklusa=egy lap letöltésével.
Bocs, ha hülyeséget beszélek,de...
ftp-n keresztül belépve van egy public_html nevű mappád, melyben elhelyezel egy darab fájlt index./html/,/php/,/valami/ névvel és egy darab index_elemei nevű mappát; csak ebben az esetben működik..
Az oldal egyébként egy hallgatótársaimmal létrehozott cucc volt, fájlokat osztottunk meg, infókat adtunk egymásnak, stb. Csak egy idő után megjelent rengeteg olyan külső felhasználó, aki nem vett részt a kommunikációban, csak elmentette könyvjelzőnek a fileletöltes.php fájl elérési útját külön, és azt nézegette, hogy van-e új fájl.. nos, mivel nem azért hoztuk létre az oldalt, hogy mi dolgozzunk, más meg még arra se vegye a fáradtságot, hogy elolvassa a kezdőlapon közzétett megjegyzéseket, kérdéseket, azt találtuk ki, hogy:
/kicsit szakbarbár megoldás talán, csak azért írom le, hogy ha nem is 100%os, de használható példát mutassak talán, ingyen tárhelyes biztonsági ötletre:/
Az index.php fájl abból állt, hogy két div, egy menüs fejléc és egy div id=tartalom.
A menü nem vitt el sehová a index.php-ról, a gombok szerepe az volt, hogy a kezdőlapon a tartalom div-be más-más dolgokat include-oljon be: példa:
A kezdőlap tfh annyi, hogy behívja a hirek.php-t.
ugye ez jelen esetben úgy nézne ki, hogy:
Mivel a hírek megjelenítését több helyen, többféleképpen is megtettük, ezért értelem szerint, -Poetro megjegyzéseihez hasonló módon- nem egy darab vaskos hirek.php fájl volt a szerveren, hanem a benne esetegesen használt függvények, stb több helyen használt kódrészletek külön-külön fájlokban foglaltak helyet;
Folytatva a példa szerinti struktúrát: volt egy mappa, hogy: index_elemei/hirek_osszetevoi/
És mivel a hirek.php az index.php részeként volt hivatott működni, ezért az összetevőinek használata úgy történt, hogy: a hirek.php fájl kódjában úgy írtuk az elérési utakat:
/persze nem feltétlenül include-dal, de: /
hanem, hogy http://www.felhasznalonev.fw.hu/index_elemei/hirek.php , nos, akkor nem jelenítette meg a kívánt fájl, mivel:
Amikor az index.php részeként include()-dal hívjuk, akkor a helyes megjelenítést kaptuk; az összetevő a felhasznalonev.fw.hu/index_elemei/hirek_osszetevoi/osszetevo1.php útvonalról érkezett.
Megpróbálva külön megnyitni pedig, a felhasznalonev.fw.hu/index_elemei/index_elemei/hirek_osszetevoi/osszetevo1.php elérési utat próbálta végrehajtani, ami ugye rossz.
Bocs, ha nagyonnagy hülyeséget írtam, tudom, hogy ez nem feltétlenül egy tökprofi megoldás, csak a kommentben olvasott problémára próbáltam egy használható, pár nem feltétlenül precíz alternatívát mondani..
Azért is írtam feltételes
Sajnos annyi helyen kóboroltam, megfelelő tárhelyet keresve, hogy alig emlékszem egy-kettőre... :(