Écrire du code sécurisé

Référence sur drupal.org : 15 Mai 2009 – 15h38 - http://drupal.org/writing-secure-code


Vous avez repéré un problème de sécurité ? Informez-en l’équipe de sécurité.

Que vous écriviez un petit bout de code ou un module de A à Z, il est important que votre code soit sécurisé.

Utilisez des fonctions de contrôle sur les sorties pour éviter les attaques par cross-scripting

Aucun contenu fourni par l’utilisateur ne doit être restitué tel quel dans le HTML.

Reportez-vous à Comment manipuler du texte de façon sûre pour plus d’informations

Utilisez la couche d’abstraction de base de données pour éviter les attaques par injection SQL

Utilisez la couche base de données correctement. Par exemple, ne concaténez jamais des données dans une requête SQL comme ceci :

<?php
db_query
('SELECT foo FROM {table} t WHERE t.name = '$_GET['user']); 
?>

A  la place, utilisez les caractères de substitution avec db_query :

<?php
db_query
("SELECT foo FROM {table} t WHERE t.name = '%s' "$_GET['user']); 
?>

S’il y a un nombre variable d’arguments dans votre requête, créer un tableau de caractères de substitution. Ne faites pas ceci :

<?php
db_query
("SELECT t.s FROM {table} t WHERE t.field IN (%s)"$from_user); 
?>

Mais faites cela :

<?php
$placeholders 
implode(','array_fill(0count($from_user), "%d"));

db_query("SELECT t.s FROM {table} t WHERE t.field IN ($placeholders)"$from_user); 
?>

Utilisez db_rewrite_sql pour respecter les restrictions d’accès aux nodes

Beaucoup d’instructions SQL qui se réfèrent aux nodes ou à la table {node} doivent êtres emballées dans un appel à la fonction db_rewrite_sql() :

<?php
$result 
db_query(db_rewrite_sql("SELECT n.nid, n.title FROM {node} n"));
?>

Le mécanisme d’accès aux nodes de Drupal requiert ces appels. Sans eux, les visiteurs pourraient avoir accès à des nodes pour lesquels ils n’ont pas d’autorisation d’accès.