A paranoia a programozók egyik kedvenc elfoglaltsága. Sose bízhatunk a bejövő adatokban, mert nem tudhatjuk, hogy honnan származnak. A neten meg vannak csúnya bácsik és nénik akik szeretik kihasználni a webalkamazások biztonsági réseit. A modell validálási szabályai arról gondoskodtak, hogy a programunk ne akarjon az adatbázisba fura dolgokat művelni, a sanitize metódus pedig arról, hogy a csúnya bácsiknak megnehezítsük a dolgát.
Bejövő adatok ellenőrzése
A sanitize
használatához a conroller elején ki kell adni a uses('sanitize');
utasítást, majd létre kell hozni egy új tisztogató ojjektumot: $takaritoNeni = new Sanitize();
. Itt is érvényes, hogy ha mindegyik controllerben akarjuk használni a sanitize metódust (és miért ne akarnánk), akkor a uses
utasítást akár a /app/app_controller.php fileba is elhelyezhetjük, ami ettől így fog kinézni:
<?php uses('sanitize'); class AppController extends Controller{ var $view = 'Smarty'; var $helpers = array('html','javascript','form'); } ?>
Sanitize
A sanitize metódus a következő tisztogatási eljárásokat ismeri:
- paranoid($nyersString, $megengedettKarakterekTömb)
- Ez a függvény kipucol minden nem-sima szöveg (beleértve a szóközt is) karaktert a $nyersString-ből. Kivételeket a $megengedettKarakterekTömb átadásával adhatunk meg.
$nyersString = ";:<script><html> @@ $takaritoNeni->paranoid($nyersString); // scripthtml $takaritoNeni->paranoid($nyersString, array(' ', '@')); // scripthtml @@
- html($nyersString, $kivesz = false)
- Ez a függvény akkor használatos amikor a user által megadott adatokat szeretnénk megjeleníteni, melyek esetleg tartalmaznak html elemeket, amitől mondjuk szétesne az oldalunk. Ha a $kivesz paraméter értéke
false
akkor kicseréli a html elemeket a strippelt párjukra, hatrue
akkor törli őket.$nyersString = '<font size="99" color="#FF0000">HEY</font><script>...</script>'; $takaritoNeni->html($nyersString); //<font size="99" color="#FF0000">HEY</font><script>...</script> $takaritoNeni->html($nyersString, true); //font size=99 color=#FF0000 HEY fontscript...script
- sql($nyersString)
- A rendszer aktuális magic_quotes_gpc beállítása alapján escapeli az sql utasításunkat.
- cleanArray($nyersTömb)
- A tömb minden elemén végrehajtja a következő lépéseket.
- Mindenfajta szóközt sima szóközzé alakít
- Minden html elem a megfelelő html entityre lesz cserélve, az újsorok (\n) <br>-re
- A kocsivissza (\r) karakterek törlése
- SQL tisztogatás
- Visszaperek átalakítása megbízható visszaperekre
Akkor a kód
Akkor lássuk a kódot! A /app/controllers/termekek_controller.php fileban kell némi módosítást eszközölnünk. Jelenleg a hozzaad() függvényünk így néz ki:
function hozzaad() { if(empty($this->data)) { $this->set('termekcsoportok', $this->Termek->Termekcsoport->generateList(null, 'Termekcsoport.termekcsoport', null, '{n}.Termekcsoport.id', '{n}.Termekcsoport.termekcsoport')); $this->render(); } else { $this->cleanUpFields(); if($this->Termek->save($this->data)) { $this->Session->setFlash('The Termek has been saved'); $this->redirect('/termekek/index'); } if($this->Termek->save($this->data)) { $this->Session->setFlash('The Termek has been saved'); $this->redirect('/termekek/index'); } else { $this->Session->setFlash('Please correct errors below.'); $this->set('termekcsoportok', $this->Termek->Termekcsoport->generateList(null, 'Termekcsoport.termekcsoport', null, '{n}.Termekcsoport.id', '{n}.Termekcsoport.termekcsoport')); } } }
Ebben a részben a $this->cleanUpFields();
és a if($this->Termek->save($this->data)) {
sorok közé kell betennünk a következő sorokat:
$takaritoNeni = new Sanitize(); $takaritoNeni->cleanArray($this->data);
A fent leírt tisztogatási eljárások közül a cleanArray
-t választottuk, mert ennek a tisztogatása számunkra minden mezőre megfelel, és így a data tömböt egy az egyben át tudtuk neki adni, nem kellett minden egyes beérkezett adatot külön-külön szűrögetni.
Ugyanezt a kódot ugyanerre a helyre beszúrhatjuk a szerkeszt() függvényünkbe is. Ha valaki már nem a scaffold-ot használja a termékcsoportok esetében, vagy más kontrollereket is létrehozott, akkor ne felejtse el ezekben is alkalmazni a pucolási lépéseket.