Biztonságosabb PHP
Szerző: Gergő | PHP | 2009 október 3. 20:47

A legtöbb internetes oldalon lehetősége van a felhasználónak adatokat küldeni a szerver felé, amiket nekünk programozóknak meg kell tisztítanunk az olyan részektől, melyek kárt tehetnek a rendszerben. A PHP 5.2.0 óta rendelkezésünkre áll az adatszűrés, angolul data filtering. Ebben a cikkben ezt nézzük át részletesebben.

Miért tisztítsunk és érvényesítünk?

Amikor a felhasználó adatot küld, akkor meg kell bizonyosodnunk róla, hogy az adat tartalmaz -e olyan részeket, mely ártalmas lehet az oldalunkra nézve. Az ilyen adatokat nem validnak, azaz nem érvényes adatnak nevezzük, és én 4 formáját emelném ki:

  • Cross-Site Scripting (XSS): Ennek a módszernek a segítségével általában javascript kódokat illesztenek be oldalunkba, ami nagyon szét tudja csapni az oldalunkat. Bővebben itt olvashattok róla.
  • SQL Injection: A második legnépszerűbb módszer, ahol úgy hajtanak végre plusz utasítást a rossz akarók, hogy közben az eredeti is lefut, így nehezen lehet észrevenni, hogy valami nem stimmel. Bővebben itt.
  • Cross-Site Request Forgery (CSRF/XSRF): Egy kevesebbet használt technika, mely például képek src tulajdonságát megváltoztatva scripteket futtat le anélkül, hogy a felhasználó ennek tudatában lenne. Bővebben itt.
  • Helytelen adat: Ez igazából nem feltétlenül rossz indulatú input, viszont szétzilálhatja oldalunk, ha telefonszámokhoz, vagy pénz összegekhez betűket is engedünk beírni.

Ebben a cikkben csak a szerver oldali biztonságról fogok írni, de a problémát a felhasználói oldalról is meg lehet közelíteni azáltal, hogy eleve nem engedünk bizonyos adatokat beírni, vagy elküldeni a szerver felé.

Hogy még az elején jobb rálátásunk legyen az érvényesítés és tisztítás közti különbségekre, a PHP manual a következőt írja róla:

A validáció az adat érvényességét ellenőrzni, hogy megfelel -e bizonyos kritériumoknak. Például a FILTER_VALIDATE_EMAIL szűrő eldönti hogy az adat érvényes email cím -e, viszont ha nem akkor nem változtat rajta.

A tisztítás /angolul sanitization ami higénikussá tételt jelent/ megtisztítja az adatot a nem oda illő részektől. Például a FILTER_SANITIZE_EMAIL eltüntetni az inputból azokat a karaktereket, amelyeket egy email cím nem tartalmazhat, viszont nem validálja azt. Tehát ha az input 67developer@gma!#il@com, akkor a ennek eredménye a 67developer@gmail@com lesz, ami tiltott karaktert ugyan nem tartalmaz, viszont nem is érvényes email cím.

Milyen szűrők állnak rendelkezésedre?

Nem minden PHP lehet azonos módon beállítva szűrők szempontjából, ugyanis a PHP 5.2.0 óta használnak szűrőket, amik egy külön kiegészítőben találhatóak meg. A legtöbb esetben minden szűrőt tartalmaz a szerverre telepített PHP, de jobb biztosra menni, ezért itt találhattok egy kódot, ami kilistázza az elérhető szűrőket:

Szűrők használata

A PHP szűrő és tisztító filter_var függvényét két paraméterrel kell meghívni. A következő példában egy változót megtisztítunk úgy, hogy a benne található egész számokat szeretnénk megtartani:

A kimenet pedig a következő lesz:

Amint látható, az első paraméterben magát az adatot, a másodikban pedig a tisztítás módját adtuk meg, majd végeredményként csak számokat tartalmazó kimenetet kaptunk.

Szűrők fajtái

Ez a lista ugyan nem teljes, de a legfontosabb szűrőket megtalálhatjuk benne.

FILTER_VALIDATE_BOOLEAN: Leellenőrzi, hogy a kapott adat logikai érték -e. Lehetséges értékeiIgazat:

  • TRUE-val tér vissza ha az adat “1″, “true”, “on”, “yes”
  • FALSE ha az adat “0″, “false”, “off”, “no”
  • Egyébként NULL a visszatérési érték
$value01 = "on";
if(filter_var($value01,FILTER_VALIDATE_BOOLEAN)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '
 
';
$value02 = "no";
if(filter_var($value02,FILTER_VALIDATE_BOOLEAN)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_EMAIL: Ellenőrzi, hogy az adat érvényes e-mail cím -e. Azt nem ellenőrzi, hogy a cím létezik-e, csak a formáját. Első esetben igazat, másodikban hamisat kapunk, hisz hiányzik az email cím vége.

$value01 = 'test@example.com';
if(filter_var($value01,FILTER_VALIDATE_EMAIL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '
 
'
$value02 = 'nettuts';
if(filter_var($value02,FILTER_VALIDATE_EMAIL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_FLOAT: Ellenőrzi, hogy az adat lebegőpontos szám -e. Első esetben igaz, másodikban hamis értéket kapunk, mivel a lebegőpontos számot ponttal és nem vesszővel kell leírni.

$value01 = '1.234';
if(filter_var($value01,FILTER_VALIDATE_FLOAT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '
 
'
$value02 = '1,234';
if(filter_var($value02,FILTER_VALIDATE_FLOAT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_INT: Az előzőhöz hasonlóan ellenőrzi, hogy az adat egész szám -e. Első esetben igaz, másodikban hamis értéket kapunk.

$value01 = '123456';
if(filter_var($value01,FILTER_VALIDATE_INT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '
 
'
$value02 = '123.456';
if(filter_var($value02,FILTER_VALIDATE_INT)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_VALIDATE_URL: Ellenőrzi, hogy érvényes e az url cím, azonban azt nem ellenőrzi, hogy valóban létezik -e az oldal ahova mutat.

$value01 = 'http://net.tutsplus.com';
if(filter_var($value01,FILTER_VALIDATE_URL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}
echo '
 
'
$value02 = 'nettuts';
if(filter_var($value02,FILTER_VALIDATE_URL)) {
 echo 'TRUE';
} else {
 echo 'FALSE';
}

FILTER_SANITIZE_STRING: Megtisztítja az adatot olyan részektől, melyek nem érvényesek vagy nem megengedettek. Ilyen például a HTML kód <script> vagy <strong>.

$value = '<script type="text/javascript"><!--mce:0--></script>';
echo filter_var($value, FILTER_SANITIZE_STRING);

Az eredmény pedig:

alert('TROUBLE HERE');

FILTER_SANITIZE_ENCODED: Ez ugyanazt a feladatot látja el, mint az url kezelésre használt urlencode() függvény, ami többek között a space és speciális karakterek helyett a kódolt formályukat adja vissza.

$value = '<script type="text/javascript"><!--mce:1--></script>';
echo filter_var($value, FILTER_SANITIZE_ENCODED);

Az eredmény:

%3Cscript%3Ealert%28%27TROUBLE%20HERE%27%29%3B%3C%2Fscript%3E

FILTER_SANITIZE_NUMBER_INT: Megtisztítja az adatot minden olyan karaktertől ami nem int, azaz szám típusú.

$value01 = '123abc456def';
echo filter_var($value01, FILTER_SANITIZE_NUMBER_INT);
echo '';
$value02 = '1.2.3.4.5.6.7.8.9';
echo filter_var($value02, FILTER_SANITIZE_NUMBER_INT);

Eredmény:

123456
123456789

Összegzés

Nagyon hasznos függvények, érdemes velük megismerkedni jobban. Aki többre kívánics, az utánaolvashat a http://www.php.net/manual/en/book.filter.php oldalon.

Oszd meg, és uralkodj:
  • Facebook
  • Twitter
  • StumbleUpon
  • del.icio.us
  • Digg

Kapcsolódó cikkek

Képek és htaccess
Pacher Márkus fotós oldalának készítése
CakePhp
Mappa bejárása PHP glob() függvényével

Hozzászólások

View Comments

Mondj véleményt

(kötelező)

(kötelező)


blog comments powered by Disqus
Email címem 67developer@gmail.com