Lenne 1-2 szakmai észrevételem ha megengeded.
Nagyon sok helyen látom ezt:
\"...= \'$_SERVER[REMOTE_ADDR]\' WHE...\"
Ilyen formát nem szoktunk használni. Helyette:
\"...= \'\".$_SERVER[\'REMOTE_ADDR\'].\"\' WHE...\"
Ez a kód idõtállósága miatt fontos. Az elõbbi kódrészlet hivatalosan nincsen, és bár
még (ebben a verzióban) mûködik, nem tudjuk
meddig.
Ez minden asszociatív (nem számmal indexelt) tömbnél fontos. Nincs $tomb[elem] csak $tomb[\"elem\"] vagy $tomb[\'elem\'].
Még egy idõtállósági dolog (Kis biztonság is) . Ilyen MySql függvényeket nem használunk. Igen, régen csak ez volt és rengeteg minden ezzel van írva, de újabb fejlesztéseknél messzire elkerüljük. A jelenlegi stabil php verzió az 5.4 , ezek a MySql függvények amiktõl hemzseg a kód, a php 5.5-ben már hibaüzeneteket fognak dobni, (régi függvény, kéri hogy használj mást) a jövõben meg teljesen ki lesznek iktatva. Ajánlom: MySqli,PDO (Személy szerint a PDO-t preferálom, illetve nézz utána az elõkészített lekérdezéseknek, PDO és MySqli is támogatja.) A szimpla MySql függvények lecserélése a biztonsági kérdéseket is megvariálja. A mysql_query függvény nem tud egyszerre több parancsot végrehajtani (Pl. nem tudsz egyszerre kiválasztani értékeket és törölni valamit egy lekérdezésben, tárolt eljárások nélkül). A PDO/MySqli viszont igen, ezért azok veszélyesebbek. Természetesen erre is van megoldás. (Elõkészített lekérdezések)
Admin függvények egyáltalán nincsenek szûrve. Ez végzetes hiba. Egy laikus/\"bosszúvágyú\" admin bármit megtehet, ha pedig olyan is hozzáférhet a panelhez adminként aki egyébként a szerveren/egyéb helyen nem rendelkezik jogokkal akkor az kellemetlen. Igaz, amíg van mysql_query ami csak 1 lekérdezést küld kicsit nehezebb dolga van (nem töröl instant adatbázist), de tényleg nem kéne ennek a függvénynek ezt a hátrányát biztonsági elõnyként kezelni, pl. lekérések feltételeit meg lehet kerülni könnyedén.
Sok kimeneti hibaüzenet szintén nincsen ellátva szûréssel, így azokba gyilkos JavaScript kódokat lehet injectelni.
echo \"<div class=\'msgbox\'>$_GET[msg]</div>\";
http://www.php.net/manual/en/function.strip-tags.phphttp://php.net/manual/en/function.htmlspecialchars.phphttp://www.php.net/manual/en/function.htmlentities.phpEzzel az ügyeskedéssel a weblapot nem lehet feltörni. Vagyis önmagában nem. Ezzel a módszerrel felhasználókat lehet lopni, anélkül hogy szerencsétlen xy egyáltalán ezt észlelné. (Természetesen nem fejtem ki
) Pontosítok. Csak (bejelentkezett) admin felhasználókat lehet lopni vele. Az admin felületrõl már beszéltünk. Nem egyszerû ezt sem megcsinálni, de meg lehet.
if(file_exists(\"pages/$_GET[p].php\"))
{
require(\"pages/$_GET[p].php\");
}
Kritikus php/szerver sebezhetõségi hiba, beállításoktól függõen. Ezzel a módszerrel tulajdonképpen bármilyen fájlt be tudok ágyazni illetve lefuttatni a php motor segítségével. Mint említettem, ezzel a php.ini-tõl függõen még akár helyben beinjectelhetem magát a php-t és helyben módosíthatom a forrást. (Vagy azt csinálok vele amit akarok) Miután azt futtatok amit akarok, adatbázisom is van. Igen, ott van hogy \"pages/\" az elején illetve a \".php\" a végén, de ezek lényegtelen információk amiket csupán az url-hez fûzött összesen 6 karakterrel el is távolítottam, onnantól meg csak a szûretlen változó van. A file_exists csak azt nézi létezik-e a fájl. Nem érdekli hogy hol van. Ha túl nagy jogköre lenne a szerveren ennek az oldalnak akkor már a szervert lehetne kóstolgatni, onnan meg hátulról minden mást ami rajta van. (Pl. ha nem rendesen beállított hostolt környezetben fut az oldal.) Ez a sebezhetõség függ a php verziójától is. 5.3.4 elõtt azt hiszem veszélyesebb volt, a frissebb php-k mintha már figyelnek a kiterjesztés eltüntetésére, de még sok helyen van 5.3.3 sõt még 5.2 is. Igazából azt se szeretnéd ha bármely php fájl ami csak megtetszene beágyaznék.
Ajánlom hogy reguláris kifejezésekkel távolíts el a változóból mindent ami nem betû,esetleg szám.
Egy tömbben tárolhatod hogy milyen oldalak vannak (
http://php.net/manual/en/function.scandir.php) és ha nem szerepel a tömbben a változó akkor ne jelenítsd meg az oldalt.
Stb...
Regisztrációnál nem ellenõrzöd az E-Mail cím valódiságát. Simán lehet tolni egy \"a@a\" semmiséggel egy felhasználót, ha rászánnék egy percet bármilyen más karakterlánccal is. A kliens oldali HTML5(ami nálad van)/JavaScript ellenõrzés
nem valódi ellenõrzés.
Felhasználónév és jelszó hosszát ajánlom korlátozni. (Minimum/maximum)
Felhasználónévbe írható karaktereket ajánlom leszûkíteni betûkre/számokra.
Egy kis adatbázis tervezési észrevétel. Azoktól a nagybetûktõl az oszlop nevek nagyon menõn néznek ki meg minden. Kár hogy Windows/Linux kompatibilitási gondot okozhatnak.
Csak belenéztem a kódba, ezeket nem feltétlenül azért írtam hogy most azonnal javíts/írj át mindent vagy ilyesmi,ócsárolni sem volt szándékom, csupán szerintem ezeket a dolgokat hasznos tudni a jövõbeli projektjeid tervezésénél.