CakePHP - Security and Sanitize : r0x !
Par foxmask le lundi, février 4 2008, 23:20 - Lien permanent
Avec CakePHP, renforcer son site web devient un jeu d'enfant grâce à 2 libs :
Le premier intervient lors de l'utilisation de formulaire.
Le second intervient lors du traitement des données des formulaires avant de stocker les infos dans la base de données.
- Security :
voici le controller dans lequel on utilise Security :
class SettingsController extends AppController {
public $name = 'Settings';
public $helpers = array('Html','Form', );
public $components = array( 'Security') ;
public function beforeFilter() {
#si des données sont renvoyées, activons la securité !
if (!empty($this->data))
#s'il s'agit d'un POST on autorise l'action "index"
$this->Security->requirePost('index');
}
public function admin_index () {
...
if (!empty($this->data)) {
...
}
}
la fonction beforeFilter agit avant que admin_index ne soit appelé et c'est là que Security entre en jeu.
$this->Security->requirePost('index');
ceci permet de filtrer les appels directs à l'action "index" qui ne peuvent avoir lieu que via un POST !
Tout autre action sera envoyée dans un "blackHole" (Trou noir 
voyons donc maintenant la Vue :
- on créé le fomulaire
<?php echo $form->create('Settings',array('action'=>'admin_index') ?>
- on ajoute un champ de texte qqconque
<?php echo $form->text('p_title' ,array("size"=>50,"maxlength"=>255,"value"=>pt_portal_title)) ?>
- on ajout un bouton
<?php echo $form->submit(__('Save',true)); ?>
- on fini le formulaire
<?php echo $form->end(); ?>
c'est 4 lignes vont produire les lignes suivantes :
<form method="post" action="/admin/settings"> <fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /><input type="hidden" name="data[__Token][key]" value="2dc4f7414071176b5eef24ee54f8db34adf83632" id="Token409653362" /> </fieldset> <input name="data[Settings][p_title]" type="text" size="50" maxlength="255" value="" id="SettingsPTitle" /> <div class="submit"><fieldset style="display:none;"><input type="hidden" name="data[__Token][fields]" value="9a18269dee671707eb5d1dbdaba4b16f9def551a" id="TokenFields1740898927" /></fieldset><input type="submit" value="Enregistrer" /></div> </form>
décortiquons ce qui s'est passé :
le fait d'avoir ajouté la ligne public $components = array( 'Security') ; dans notre controller,
indique à CakePHP, de générer dans la Vue, les champs __Token, lors de l'utilisation de $form->create() et $form->end()
Ainsi paré, votre application part à la plupart des tentatives d'accès frauduleuses ! :D
simple et efficace, on utilise Sanitize comme suit :
uses('sanitize');
// Next, create a new Sanitize object:
$mrClean = new Sanitize();
ensuite on filtre toutes les données avec un simple $mrClean->escape($my_data);
ceci s'utilise généralement pour filtrer les données provenant de formulaire, avant de les stocker dans notre base.
plus d'infos sur CakePHP Security et Satinize 
Bonne lecture !