Juil
28

Recommandations de sécurité Ez publish et PHP

Failles xss

Avec Ez Publish

Utiliser la fonction wash() sur les variables dans les templates, surtout sur les variables pouvant être modifiées par l’utilisateur (paramètres d’url, champs de formulaire, etc)

En PHP

La stratégie de protection principale contre les injections HTML est la même que pour toutes les injections. Il est recommandé d’implémenter une fonction de filtrage en entrée et une fonction d’encodage en HTML en sortie.

L’encodage en sortie peut être effectué par deux fonctions en PHP :

htmlspecialchars() remplace tous les caractères qui ont une signification spéciale en HTML par leur entité HTML. Cette fonction va cibler les caractères suivants :

  • &, le « et commercial », qui commence les séquences HTML (telles que &) ;
  • ‘, les guillemets simples, utilisés dans les attributs ;
  • , les guillemets doubles, utilisés dans les attributs ;
  • < et >, les signes « inférieur à » et « supérieur à », qui délimitent une balise.

htmlentities() est une version plus complète de htmlspecialchars(), elle remplace dans une chaîne tous les caractères possibles par leur séquence HTML. Il est possible de spécifier le masque et l’encodage à utiliser

<a href="http://www.php.net/htmlentities" target="blank">htmlentities</a>($str, ENT_QUOTES, 'UTF-8');

Recommandations diverses

  1. Validation du type de la donnée en entrée (entier, chaîne de caractères…) et cela après avoir vérifié la présence attendue de la variable en question, il est possible de s’appuyer sur les fonctions PHP suivantes :
    • is_array() pour vérifier si la variable est un tableau ;
    • is_string() pour vérifier si la variable est une chaîne ;
    • is_int(), is_integer(), is_long() pour vérifier si la variable est un entier ;
    • is_float(), is_real(), ou is_double() pour vérifier si la variable contient un nombre décimal ;
    • is_bool() pour vérifier si la variable contient une valeur booléenne ;
    • is_numeric() pour vérifier si la variable contient un nombre décimal ou entier ;
    • is_scalar() pour vérifier si la variable contient une valeur scalaire : nombre, booléen, chaîne ;
    • is_object(), is_resource(), is_callable() et is_null() sont aussi disponibles en PHP, pour tester respectivement des objets, des ressources PHP, une fonction valide ou la valeur NULL.
  2. Utilisation, outre le type, de la taille des données fournies à PHP qui constitue une information importante.
  3. Utilisation de liste blanche (ou noire) : la liste blanche s’applique aux chaînes de caractères : elle représente alors les caractères dont l’emploi dans une chaîne est permis, à l’exception de tous les autres. Cela peut être utile par exemple dans le cas où l’on n’utilise pas les requêtes préparées et que l’on veut restreindre les risques d’injections SQL dans notre requête. Il est possible d’exclure des mots clés comme UNION, SELECT, UPDATE, DELETE, DROP, SCHEMA, FROM, etc.

Cela permet de blacklister les mots clés SQL afin d’éviter les tentatives d’injection sql à l’aveugle (Doc blind SQL injection )

  1. Utilisation des expressions régulières pour la validation des chaînes de caractères uniquement :
    • /[a-z]/ autorise les caractères alphabétiques minuscules : liste blanche
    • /[^a-z]/ interdit les caractères alphabétiques minuscules et autorise tous les autres
  2. Utilisation des extensions (PHP Filter) propose une gamme de filtres bien plus vaste que celle de Ctype et avec un coût de validation plus faible que les expressions régulières :
$cleanEmail = <a href="http://www.php.net/filter_var" target="blank">filter_var</a>($_GET['email'], FILTER_VALIDATE_EMAIL);

Cette extension dispose aussi de directives qui permettent d’imposer l’utilisation des filtres sur les données entrantes, avant même que le script PHP ne soit exécuté. Par défaut, cette directive utilise le filtre UNSAFE_RAW. Il est recommandé d’utiliser d’autres valeurs pour cette directive. Il faut alors passer en revue la liste des options disponibles pour choisir la plus adaptée à l’application concernée. (Document PHP sur les filtres).

Injections SQL

Avec Ez Publish

Si vous faites des requêtes SQL en utilisant EzDb, il faut échapper toutes les variables à l’aide de la fonction escapeString (cette fonction utilise la fonction php mysqli_real_escape_string(), mysql_real_escape_string() ou autre variante selon la bdd utilisée)

$db = eZDB::instance;
$db-&gt;escapeString($var);

Pour les valeurs numériques, il est recommandé d’utiliser la fonction intval() de PHP.

$valeurNumerique = <a href="http://www.php.net/intval" target="blank">intval</a>($var) ;

En PHP

Il convient d’utiliser des méthodes telles que les « Prepared Statements » et « Parametized Queries » correspondant aux bonnes pratiques de sécurité :

Grâce à ces méthodes, c’est le serveur de base de données lui-même qui se charge de forger la requête avec les paramètres envoyés, dont les caractères malveillants n’ont alors plus aucun effet.

Si l’utilisation de ces méthodes n’est pas possible, il convient alors d’échapper correctement les données grâce aux fonctions telles que mysql_real_escape_string() et intval() pour les valeurs numériques.

Divers

Dans le cas d’utilisation d’un CMS

  • Dans la mesure du possible, installer les mises à jour du CMS, surtout si celles-ci corrigent des failles de sécurité.
  • Il convient de masquer le plus possible les références au CMS utilisé, que ce soit dans le code des pages web (balises métas, etc) ou dans les en-têtes des réponses http. Cela limite les possibilités d’explorer des vulnérabilités au CMS (dans le cas où celui-ci ne serait pas à jour)

Pour Ez Publish

  • Désactiver le module ezinfo ou rediriger vers une autre page telle que la page d’accueil ou une page d’erreur.

Dans le siteaccess, ajouter ceci à votre site.ini

[SiteAccessRules]
Rules[]	
Rules[]=access;disable
Rules[]=module;ezinfo

Vous pouvez aussi désactiver d’autres modules si besoin (http://pwet.fr/blog/securiser_un_site_ez_publish)

  • Limiter les endroits où l’on affiche le CMS utilisé :
    • Entête http X-powered-by (attention, cette entête est codée en dur…il faut donc modifier les fichiers du kernel et faire un patch)
    • Balises metas (à modifier dans votre fichier de configuration)
MetaDataArray[author]=Memorandom
MetaDataArray[copyright]=Memorandom
MetaDataArray[description]=Description de memorandom
MetaDataArray[keywords]= memorandom, blog, web, php, html, etc
  • Sécuriser les cookies de sessions afin d’éviter les vols de sessions (dans le site.ini)
[Session]
CookieHttponly=true

Bonnes pratiques générales

  • Sécuriser les cookies de sessions afin d’éviter les vols de sessions (httponly et/ou mode secure )
Httponly :
Marque le cookie pour qu’il ne soit accessible que via le protocole HTTP. Cela signifie que le cookie ne sera pas accessible par les langages de script, comme Javascript. Cette configuration permet de limiter les attaques comme les attaques XSS (bien qu’elle ne soit pas supportée par tous les navigateurs).
  • Désactiver l’autocomplétion (autocomplete=“off”) sur les formulaires « sensibles » comme le formulaire de login par exemple.
  • Maintenir à jour vos extensions ou librairies externes (style CKEditor, TinyMCE) afin d’avoir toutes les mises à jour de sécurité (Retour d’expérience personnelle)




Poster un commentaire

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Étiquettes