Weboldalak biztonsága

Mivel egy elég fontos témakör (és junior állásinterjún szeretik kérdezni is) íme összegezve néhány biztonsági javaslat (a teljesség igénye nélkül):


Bemenetek vizsgálata

Ha számot vársz akkor kasztold, ha szöveget akkor regex-el vizsgáld, stb

Tehát pl szám esetén:

$model_obj->where("id", "=", (int)$id);


SQL injection védelem

Vizsgáld a bemenetet és escape-eld a stringeket

mysql_escape_string($szoveg)


Vizsgálj mindig jogosultságot

Ne sajnáld a processzoridőt, minden lekérdezésnél vizsgáld, hogy megfelelő jogokkal rendelkezik-e a látogató a rendszeredben


Éles oldalon display_error = off

Ez üzemeltetés – de azon túl, hogy nem esztétikus még hackerkedő hangulatúaknak is kedvet adhatsz a mókázáshoz, ha látják a hibaüzeneteket


Használj hosszú jelszavakat

Nem éppen php dolog, de előfordul, hogy ftp-n vagy bárhogy belemódosítanak a saját php file-jaidba, ha rájönnek a jelszavaidra.


File post-kor vizsgáld a file formátumát

És mindig ellenőrizd, hogy a szerver .tmp-re varázsolja-e át a nevét amikor azt a temp mappába rakja, nehogy egy illegális php feltöltésekor futtatni tudja azt

 

Használj htmlspecialchars-t vagy strip_tags-et

olyan helyre, ahol a felhasználó korábbi szövege másoknak megjelenik. Ezzel megakadályozod, hogy <script> tag-et (vagy rosszabb esetben <?-t) használhasson.

 

Külön user-ként fuss!

Ez inkább már üzemeltetés – de figyelj arra, hogy egy weboldal egy külön user nevében fusson a szerveren (és az még véletlenül se root legyen), hogy ha még azt az egy oldalt fel is nyomják, ne férjenek hozzá más oldalhoz, vagy az egész filerendszerhez.

 

Sózd a jelszavakat és még kliensoldalon titkosítsd, vagy használj https-t

Igen, lehallgathatók az oldalak kommunikációi, ha hagyományos http protokollt használ az oldalad. És adatbázisba se plain text-be mentsd el őket…! 🙂

 

Különítsd el a meghívható és a futthatható file-okat

Figyeld, hogy a file hogyan lett megnyitva. Vizsgáld pl a config.php-ban, hogy ha a file közvetlenül lett meghívva akkor azonnal exiteljen ki.
pl definiálsz a futtatható elejére egy START makrót és a include-olt file-ok elején vizsgálod:

!defined(‘START’) ? exit(‘Access Denied’) : NULL;

 

Szükség esetén titkosítsd a php kódodat is és éles oldalad forrását ne add tovább

Így még feltörés esetén sem tudnak belemódosítani úgy, hogy észrevétlenek maradjanak. Ja és visszafejteni se tudják.

 

Figyeld a felhasználók által feltöltött anyagok valódiságát

Ha a felhasználónak megengeded, hogy pl saját képet illesszen be az oldaladra akkor beillesztéskor vizsgáld a kép url header-ét. Olyat is láttam már, hogy egy olyan url-t raktak be, amit átengedett a kép url-t validáló, de aztán a link 301-et dobott és átirányított a logout.php-ra 
Ekkor az történt, hogy mivel a böngésző meg akarta jeleníteni a fake image-t megjelenítés helyett mindig vissza kijelentkeztette a user-t az oldalról…

 

N+1

Ha javítasz, debugolsz, fejlesztesz ne éles rendszeren csináld. Töltsd le localhostra, vagy ha nagyon kemény vagy tartsd fenn a szerveren, de készítsd róla egy másolatot egy almappába és azon ügyködj. Senkinek sem jó az, hogy miközben fejlesztesz addig vacakol az oldal…

Egyszerű képgaléria

Úgy hozta az élet, hogy bátyámnak szüksége volt gyorsban egy gépgalériára, ami ájpeden, meg mindenféle flincflanc tableten jól néz ki, aztán összedobtam egyet.

Szerintem jópofa, ha valakit érdekel és lusta maga csinálni akkor vigye:

image_gallery

 

Kicsomagolás után nyisd meg a config.php file-t, írd át a jelszót, meg adj a galériának valami címet.

Ezután már fel is töltheted egy szerverre.

 

Használata:

A képeket az images mappán belüli mappákba pakolhatod. Mappa-mappán belül is lehet.

 

Egészségetekre!

jQuery tapasztalatok – változók átadása

A javascript egy elég keszekusza nyelv – aki foglalkozott már vele tudja miről írok. A keszekuszaságban vannak esetek, amikor jQuery barátunkkal objektumokon végzünk módosításokat, amik egy bizonyos function-ökben történnek. Biztos megfigyeltétek már: ha a function-nek van paramétere akkor a külső változók nem látszanak a function-ön belüli részek számára.

Agyaltam jó sokat, hogy hogyan lehetne e problémát kiküszöbölni – aztán megvilágosodtam.

Megoldás: set/get property írás/olvasás a html elemeken.

Használjuk az .attr() jQuery függvényt:


$("#akarmi").attr("data-post_id", "5");

Az .attr() metódusnak két “üzemmódja” van.

Ha egy paramétert kap akkor property olvasás van, ha két paraméter akkor key-value értékadás/beállítás.

Tehát a


<div id="akarmi">...</div>

elem a fenti js kód lefutása után lényegében így fog kinézni:


<div id="akarmi" data-post_id="5">...</div>

Amit aztán a


.attr("data-post_id")

metódussal vissza kiolvashatunk.

Hát nem egyszerű? 🙂

e107 memcache (v1.0.1)

Ha esetleg volna valaki még (rajtam kívül) aki annyira elvetemedett, hogy e107-et használ (1.0.1-es verzióról van szó) és szeretne még rajta valamennyit gyorsítani próbálkozzon meg memória cache-eléssel.

 

Annyi a teendő, hogy a /e107_handlers/cache_handler.php filet felülírjuk az alább letölthető zip-ben lévő file-al és bekapcsoljuk a weboldalon a cache funkciót. Természetesen telepítve kell legyen a szerverre a memcached, máskülönben ne várjunk eredményt.

 

LETÖLTÉS

***Megjegyzés***

Ez a patch saját kreálmány, még csak néhány napja tesztelem, felelősséget egyelőre nem vállalok érte. 🙂

File based cache

Képzeld el a helyzetet, hogy van egy óriási adatbázisod, amit jól lehet gyakran kell olvasnod, sokszor ugyanazt. Ha sokat pörgeti a procit a mysql akkor próbáld ki a probléma kiküszöbölésére készült programomat, ami letölthető INNEN.

 

Használata

new cache($name, $timeout = 1800) ;

Segítségével létrehozod a cache objektumot. $name paramétere a kulcs, ami lehet egy key vagy egy mysql lekérdezés is. A $timeout paraméternek olvasáskor van értelme – ezt másodpercben értjük. Lényege, hogy írás/módosítás után ennyi másodperccel érvénytelen lesz a diszken lévő cache file. Fontos megjegyezni, hogy a program erőforráskímélés céljából nem törli a használaton kívüli cache fájlokat. Ha e paramétert nem állítjuk be akkor a default paraméter lesz érvényes, ami 1800 másodperc.

setCache($filestring);

Egyetlen paraméterében egy stringet vagy integert vár. A kapott értéket azonnal beírja az adatbázisba. Visszatérési értéke nincs.

 

setArrayCache($array);

Paraméterében tömböt vár. Lényegében ugyanazt csinálja, mint a setCache(), csak tömböt lehet vele cache-elni. Fontos, hogy nem getCache()-el olvassuk az így beírt értékeket, hanem a getArrayCache()-el.

 

getArrayCache();

Visszatérési értéke a setArrayCache() által beírt érték.

 

getCache();

Visszatérése a setCache() által beírt érték

 

checkCache();

TRUE-val tér vissza, ha létezik érvényes cache file, FALSE-val, ha nincs cache-elve az adat

 

delCacheFile();

Törli a példányosított cache file-t.

 

cache::caching($sql, $timeout = 1800);

Osztályszintű metódus, melynek első paramétere egy mysql lekérdezést vár string-ben, második paramétere pedig a már korábban megismert időtúllépés, illetve, ha -1 akkor nincs cache.

Visszatérése pedig egy többdimenziós asszociatív tömb, mely tartalmazza az adatbázislekérdezés eredményét.

 

cache::cleanup($sql);

Osztályszintű metódus, mely törli a paraméterben megadott sql lekérdezés eredményeit cache-ből.

 

cache::fullCleanup();

Osztályszintű metódus, ami törli a teljes cache adatbázist.

 

Telepítése

1. Hozz létre a htdocs-od felett egy cache mappát (htdocs mellé)

2. Másold be a cache.php file-t a htdocs-ba, majd require_once “cache.php”-al vedd használatba.