Article de reference

Citations magiques

Les guillemets magiques étaient une fonctionnalité du langage de script PHP , dans laquelle les chaînes sont automatiquement échappées (les caractères spéciaux sont préfixés par...

Les guillemets magiques étaient une fonctionnalité du langage de script PHP , dans laquelle les chaînes sont automatiquement échappées (les caractères spéciaux sont préfixés par une barre oblique inverse ) avant d'être transmises. Ils ont été introduits pour aider les nouveaux arrivants à écrire des commandes SQL fonctionnelles sans nécessiter d'échappement manuel. Ils ont ensuite été décrits comme étant destinés à empêcher les développeurs inexpérimentés d'écrire du code vulnérable aux attaques par injection SQL .

Cette fonctionnalité a été officiellement abandonnée à partir de PHP 5.3.0 et supprimée dans PHP 5.4, en raison de problèmes de sécurité.

Concept

La révision actuelle du manuel PHP mentionne que la raison d'être des guillemets magiques était de « prévenir que le code écrit par des débutants soit dangereux ». Cependant, ils ont été introduits à l'origine dans PHP 2 comme un paramètre de compilation php.h pour msql, échappant uniquement les guillemets simples, « facilitant le passage direct des données de formulaire aux requêtes msql ». Ils étaient à l'origine destinés à être une « fonctionnalité pratique, pas une fonction de sécurité ».

Le champ d'utilisation des guillemets magiques a été étendu dans PHP 3. Les guillemets simples, les guillemets doubles, les barres obliques inverses et les caractères nuls dans toutes les données fournies par l'utilisateur sont tous précédés d'une barre oblique inverse avant d'être transmis au script dans les $_GETvariables globales $_REQUEST, $_POSTet $_COOKIE. Les développeurs peuvent alors en théorie utiliser la concaténation de chaînes pour construire des requêtes SQL sûres avec les données fournies par l'utilisateur. (Cela était particulièrement vrai lorsque PHP 2 et PHP 3 étaient à jour, car les principales bases de données prises en charge n'autorisaient que les jeux de caractères à 1 octet.)

Critique

Les guillemets magiques étaient activés par défaut dans les nouvelles installations de PHP 3 et 4, mais pouvaient être désactivés via la magic_quotes_gpcdirective de configuration. Étant donné que le fonctionnement des guillemets magiques se faisait en coulisses et n'était pas immédiatement évident, les développeurs n'étaient peut-être pas au courant de leur existence et des problèmes potentiels qu'ils pouvaient introduire. La documentation PHP a souligné plusieurs pièges et a recommandé que, bien qu'ils soient activés par défaut, ils soient désactivés.

Problèmes avec les citations magiques inclus :

  • Toutes les données fournies par l'utilisateur ne sont pas destinées à être insérées dans une base de données. Elles peuvent être affichées directement à l'écran, stockées dans une session ou prévisualisées avant d'être enregistrées. Cela peut entraîner l'ajout de barres obliques inverses là où elles ne sont pas souhaitées et leur affichage à l'utilisateur final. Ce bug se glisse souvent dans les logiciels les plus utilisés.
  • Toutes les données fournies par l'utilisateur et utilisées dans une requête de base de données ne sont pas obtenues directement à partir de sources protégées par des guillemets magiques. Par exemple, une valeur fournie par l'utilisateur peut être insérée dans une base de données, protégée par des guillemets magiques, puis récupérée ultérieurement de la base de données et utilisée dans une opération de base de données ultérieure. Cette dernière utilisation n'est pas protégée par des guillemets magiques, et un programmeur naïf habitué à s'appuyer sur eux peut ne pas être conscient de la nécessité de la protéger explicitement.
  • Les guillemets magiques utilisent également la fonctionnalité générique fournie par la fonction PHP addslashes(), qui n'est pas compatible avec Unicode et qui est toujours sujette à des vulnérabilités d'injection SQL dans certains codages de caractères multi-octets. Les fonctions spécifiques à la base de données telles que mysql_real_escape_string()ou, lorsque cela est possible, les requêtes préparées avec des paramètres liés, sont préférées.
  • Bien que de nombreux systèmes de gestion de bases de données prennent en charge l'échappement des guillemets avec une barre oblique inverse, la norme exige en fait l'utilisation d'un autre guillemet. Les guillemets magiques n'offrent aucune protection aux bases de données qui ne sont pas configurées pour prendre en charge l'échappement des guillemets avec une barre oblique inverse.
  • La portabilité est un problème si une application est codée avec l'hypothèse que les guillemets magiques sont activés et est ensuite déplacée vers un serveur où ils sont désactivés, ou vice versa.
  • L'ajout de guillemets magiques et leur suppression ultérieure, le cas échéant, entraîne une légère mais inutile perte de performances.
  • Les guillemets magiques ne protègent pas contre d’autres vulnérabilités de sécurité courantes telles que les attaques de script intersite ou les attaques par injection d’en-tête SMTP .

En novembre 2005, les principaux développeurs de PHP ont décidé qu'en raison de ces problèmes, la fonctionnalité des guillemets magiques serait supprimée de PHP 6. Lorsque le développement de PHP 6 s'est arrêté et que le développement a continué sur la branche 5.x à la place, la fonctionnalité a été déconseillée dans PHP 5.3.0 et supprimée dans 5.4.

Autres approches

  • Certains langages comme Perl et Ruby optent pour une approche impliquant la contamination des données , où les données provenant de sources non fiables, telles que les entrées utilisateur, sont considérées comme « contaminées » et ne peuvent pas être utilisées pour des opérations dangereuses jusqu'à ce qu'elles soient explicitement marquées comme dignes de confiance, généralement après validation ou codage. Étant donné que la construction de requêtes SQL est considérée comme « dangereuse » dans ce contexte, cela oblige le programmeur à résoudre le problème. La contamination ne résout pas le problème, mais elle met en évidence les cas où il y a un problème afin que le programmeur soit en mesure de les résoudre de manière appropriée.
  • Joel Spolsky a suggéré d'utiliser une forme de notation hongroise qui indique si les données sont sûres ou non.
  • Les moteurs et bibliothèques de bases de données modernes utilisent des requêtes paramétrées pour transmettre des données à la base de données séparément des commandes SQL, réduisant ainsi considérablement le besoin d'échapper les données avant de construire les requêtes.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index