Sécuriser ses variables grâce à la fonction secure( ... )

Un article de Wiki Maximus CMS.

Maximus 2008 est doté d'une fonction de sécurité regroupant toutes les filtrations possibles et imaginables, facilitant ainsi le développement et surtout ne sollicitant pas un re-codage de tous les scripts antérieurs s'il en sont dotés lors d'une mise à jour de cette même fonction ou de l'une de fonction dont elle est composée.


En bref, c'est une solution dites gagne temps & fiabilité du code. J'aurai pu faire plus joli en la mettant en classe, mais comme dans chaque domaine il faut arriver à tirer le meilleur de chaque possibilité et la fonction est réellement plus facile dans cette situation et fait gagner un temps précieux aux développeurs ( ce que nous recherchons tous ), la solution donc procédurale a été retenue.


Nous allons détailler par ce tuto, chaque spécificité de cette fabuleuse fonction de filtration de tout type de variables.



Sommaire

Exemples de variables filtrées

  • Exemple de choix binaire : 0 ou 1
$var = secure( $var, 'bin');


  • Exemple de choix numéraire: ne comprenant QUE des chiffres positifs
$var = secure( $var, 'num');


  • Exemple de filtration de langage: french, italian, english, spanish, japanese, all
$var = secure( $var, 'lang');


  • Exemple de variable passée par l'argument stripslashes afin d'enlever les \ issues de la base de données
$var = secure( $var, 'strip');



Filtrer les variables: binaires, numéraires, langues, stripslashes

Cette filtration se fera par le second argument de la fonction secure:

  • Exemple d'utilisation: $datas = secure( $datas, 'second_argument');

Ce second argument peut être : bin, num, lang, strip ou tout simplement vide.


  • Filtration binaire

Souvent utilisé afin de valider une position ouvert/fermé ou activé/désactivé le mode binaire s'impose.
Seules ne seront autorisées les valeurs 0 ET 1, aucune autre valeur ne peut être affectée !

$actif = secure( $actif, 'bin');


  • Filtration numéraire

Souvent utilisé pour les tous les type de nombres positifs.
Seules les valeurs positives de 0 à l'infini ne seront affectée ( exemple: 10 , 6547895014, 5 , ... )

$id = secure( $id, 'num');


  • Filtration de langue

Souvent utilisé pour ne filtrer que le contenu autorisé de type langue.
Seules les valeurs suivantes seront affectées: french, italian, english, spanish, japanese, all

$currentlang = secure( $currentlang, 'lang');


  • Filtration de type stripslahes( $var )

Souvent utilisé pour tout type de variable combinant chiffres, lettres et sigles

$phrase = secure( $phrase, 'strip');


  • Cas particulier

Si aucun argument n'est invoqué

 exemple:  $datas = secure( $datas, '');

Alors aucun de ces filtres ne sera appliqué, mais attention toutefois à bien mettre un argument vide du type

 , ''); 

sans quoi cet oubli génèrera un message d'erreur indiquant qu'un argument est manquant !



Filtrer le code HTML autorisé dans une variable


Cette filtration se fera par le troisième argument de la fonction secure:

  • Exemple d'utilisation: $datas = secure( $datas, , 'troisième_argument');

Ce troisième argument peut être : clean, hard, 1 ou par préference nohtml, html ou tout simplement vide.


  • Filtration de type clean

Cette filtration utilisée très très souvent dans le CMS a plusieurs avantages dont le premier son excellent rapport performances/efficacité, en effet ici nous appliquons une filtration de type strip_tags( ... ), autrement dit on supprime tout type de code HTML malicieux ou non, Cette fonction étant nativement générée par PHP, il est d'évidence que nous ne pouvons pas y toucher donc la modifier pour nos propres besoins, mais nous verrons que nous avons d'autres alternatives (même si la fonction en elle même est personnalisable, d'autres choix ont été sélectionnés pour Maximus).
Voici un exemple d'utilisation:

$datas = secure( $datas, '', 'clean');

Dans ce cas précis tout code HTML non autorisé par la fonction strip_tags sera supprimé.
Pour tout complément d'informations sur cette fonction, rendez vous sur le site de référence www.php.net


  • Filtration de type hard

Attention alors là ça dégage tout, mais vraiment tout type de code HTML, à n'utiliser que dans des cas bien précis donc !
Voici un exemple d'utilisation:

$datas = secure( $datas, '', 'hard');

Cette argument est donc extrêmement puissant, tout développeur l'utilisant devra s'assurer de sa nécessité !


  • Filtration de type 1 ou mieux encore nohtml

Cette filtration porte en fait le même argument 1 ou nohtml, il sera de bonne augure dans l'avenir de n'utiliser que nohtml pour des raisons de compréhension du code à la lecture.
en effet dans les versions antérieures de Maximus, la fonction secure( ... ) n'était pas aussi puissante et développée, nous n'utilisions alors que l'argument 1, mais avec Maximus 2008 et la fonction secure( ... ) ayant pris une importance majeure dans le code, il est de bonne augure de rendre le code plus lisible!
Voici un exemple d'utilisation:

$datas = secure( $datas, '', 'nohtml');

Anciennement nous faisions:

$datas = secure( $datas, '', '1');

Cette filtration posera un filtre que l'on connait depuis longtemps dans Maximus qui se nomme Check_Html( ... ), comme cette fonction a des avantages et des inconvénients, d'autres comme les arguments clean et hard sont venus en complément depuis la version 2008.
Avantage de cette filtration: personnalisable à souhait
Inconvénient de cette fonction: nettement plus lente que le fait d'utiliser clean ou même hard avec dans tous les cas moins d'efficacité.

Toutefois cette filtration étant personnalisable il était bon de conserver la possibilité de l'utiliser, même si il faut le dire l'argument clean est bien plus sollicité (en fait il faut choisir si l'on veut que le CMS soit ultra performant il nous faut autant que faire ce peut utiliser les fonctions natives de PHP).


Alors que fait nohtml, il tente de supprimer tout code HTMl malicieux ou non de la variable filtrée (tout comme l'argument clean donc), ce qui explique le pourquoi l'argument clean est bien plus utilisé dans le CMS, car pour arriver au même point (enfin pour tenter d'y parvenir) nous utilisons une fonction ici non pas native de PHp mais en surcouche de PHP donc plus lente :(
Conclusion optez plutôt pour l'argument clean que nohtml, sauf si vous savez exactement ce que vous faites :) (mais ceci nécessitera la compréhension e cette fabuleuse fonction qu'est la fonction check_html( ...) ).

En bref, utilisez plutôt

$datas = secure( $datas, '', 'clean');

que

$datas = secure( $datas, '', 'nohtml');


  • Filtration de type html

C'est là que la fonction check_html( ...) prend toute son envergure, en effet en utilisant l'argument html il est possible de choisir parmi un tableau de configuration quels tags HTML seront autorisés ou non !
Extrêmement utile par exemple lorsque l'on désire laisser aux utilisateurs de vos sites la possibilité d'utiliser quelques tags HTML de votre choix.
Exemple d'utilisation:

$datas = secure( $datas, '', 'html');

La configuration se fera (à la date d'écriture de ce tuto), depuis le fichier kernel/config.php dans les toutes dernières lignes.
vous retrouverez un tableau nommé $AllowableHTML contenant les balises autorisées par l'argument html.
Les tags HTML autorisés par défaut sont : b, i, a, em, br, strong, blockquote, tt, li, ol et ul
Si vous êtes un petit apprentis hacker vous aurez compris tout de suite qu'il y en a bien assez pour déjà défacer un site internet rien qu'avec ces simples tags, a étant tout particulièrement dangereux !
Bien évidemment d'autres sécurités posées dans Maximus rendront les attaques dont je veux parler non nuisibles, aucun soucis donc coté sécurité avec ces quelques tags.


  • Cas particulier

Si aucun argument n'est invoqué

 exemple:  $datas = secure( $datas, '', '');

Alors aucun de ces filtres ne sera appliqué, mais attention toutefois à bien mettre un argument vide en cas d'utilisation d'un quatrième argument du type

 '', '', 'quatrième_argument'); 

Dans tous les autre cas, cet argument n'est nullement obligatoire !



Filtrer une variable avant enregistrement en base de données MySQL

Cette filtration se fera par le quatrième argument de la fonction secure:

   * Exemple d'utilisation: $datas = secure( $datas, , , 'quatrième_argument'); 

Ce quatrième argument peut être : fck, sec, xss ou tout simplement vide.


  • Argument fck

Cette filtration est l'outil idéal pour entrer en base de données tout type de champs utilisant au préalable FCKeditor, c'est donc extrêmement simple .
Exemple:

 $datas = secure( $datas, '', '', 'fck');

Cette simple filtration posée juste avant un INSERT ou un UPDATE en base de données vous assurera l'idéal requis.


  • Argument sec

L'argument sec est tout simplement le diminutif de secure ( évoquant et parlant donc), idéal par exemple pour les titres, les pseudos, les champs divers non numériques, ici deux filtres seront appliqués à la variable: addslashes( ... ) pour s'assurer la sécurité htmlentities( ..., ENT_QUOTES ), pour parfaire :) Exemple:

 $datas = secure( $datas, '', '', 'sec');

En résumé: efficacité lors d'une entrée en base de données hors FCKeditor


  • Argument xss

Comme l'argument le laisse entendre nous avons ajouté ici un filtre visant à lutter contre les attaques de type XSS.
Cet argument est l'argument idéal pour tout champs saisis pas vos utilisateurs ne laissant aucun doute sur ce qu'ils vont rentrer en base de données.
Nous appliquons ici un filtre de type sec + un passage par la fabuleuse strip_tags( ... ), nul doute donc de l'efficacité :)

Exemple:

 $datas = secure( $datas, '', '', 'xss');

En résumé: efficacité extrême pour tout champs (hors fckeditor) dans lesquels vos utilisateurs pourraient y saisir quelques chose ( code malicieux ou non ).



Filtrations permanentes de chaque variable par la fonction secure( ... )

Pour des raisons évidentes toutes les variables passées par cette fonction sont soumises à une première filtration:

* $data = trim($data );

Ceci a pour impact de supprimer tout espace avant et après la variable filtrée.


Dans un second temps, et seulement dans le modules News actuellement toutes les variables passées par cette fonction son pré-filtrées par la fonction check_words

* data = check_words( $data );

Ceci a pour impact de filtrer toute variables par le biais des mots clefs interdits.
Ceci se configure dans le fichier modules/news/includes/functions.php

Dans un troisième temps nous remplaçons tous les sauts de lignes non valides W3C par un saut de ligne valide, et ce de manière transparente pour l'utilisateur de Maximus, ceci afin de tenter d'obtenir une validation W3C sur toutes les pages du CMS.



Ou trouver cette fonction et comment la réécrire sans modifier le kernel

Cette fonction, regroupant en elle même plusieurs autres fonctions, se situe dans le fichier kernel/secutity.php.


Comme toujours si vous deviez modifier cette fonction ou l'une des fonctions inclues dans secure( ... ), il est 'très fortement recommandé de ne jamais modifier les fichiers du kernel d'origine.

En effet maximus 2008 étant doté d'origine de la possibilité de réécrire les fonctions du kernel, là encore nous n'allons pas nous en priver !

Supposons donc que je désire me réécrire ma propre fonction secure( ... ) pour des besoins spécifiques, il me suffit :

1) créer un nouveau fichier que je nommerai security.php
2) placer ce fichier dans le dossier kernel/perso/
3) de réécrire ma propre fonction secure( ...) comme ceci par exemple

 Function Secure( $data, $type, $nohtml = false, $save = false, temperature ) {
              /*  ici ma filtration rien qu'à moi :) */
              return $data;
      }

Ainsi je suis content, maintenant ma fonction secure() filtrera en plus la température, argument important pour mon site :)
Bien évidemment ceci n'est qu'une exemple de ce que l'on peut faire, et montre encore une fois la puissance de Maximus qui a été développé dans plusieurs sens spécifiques: évolutivité, sécurité, robustesse, performances extrême, et enfin facilité de mise à jour



Ce qu'il faut retenir de cette fonction de traitement des variables

Cette fonction est une fonction clef de Maximus, auquel tous les scripts PHP du CMS feront référence à tout moment.
Je la pense assez facile de prise en main et de compréhension pour tout type de développeur (béotien à confirmé') surtout avec cette page explicative des plus précise.

Vous pouvez bien évidemment apporter votre contribution ou tout complément d'information sur ce tuto ou sur nos forums.


Souhaitant par cette fonction (et c'est certain), faire gagner un temps très précieux à vos divers développements.


Enfin, et cela me semble d'évidence (comme vous pouvez le constater dans tous les scripts internes à Maximus), il est tout à fait possible de jumeler plusieurs arguments dans cette fonction :)


Cyril 29 sep 2008 à 10:33 (CEST)