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.

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 !