CakePHP project építés 5. rész

cakephpA 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, ha true akkor törli őket.


$nyersString = '<font size="99" color="#FF0000">HEY</font><script>...</script>';

$takaritoNeni->html($nyersString);   //&lt;font size=&quot;99&quot; color=&quot;#FF0000&quot;&gt;HEY&lt;/font&gt;&lt;script&gt;...&lt;/script&gt;

$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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.