Protégez les comportements de serveur ColdFusion d’Adobe Dreamweaver contre les attaques par injection de code SQL.

Risque de sécurité des attaques par injection de code SQL

Certaines bases de données vous permettent d’envoyer plusieurs instructions SQL dans une seule requête de recherche. Pour cette raison, vous vous exposez à des risques de sécurité potentiels lorsque vous transmettez des paramètres d’une chaîne de requête à une requête de base de données générée dynamiquement. Les pirates peuvent tenter de modifier l’URL ou de former des variables dans une requête dynamique en ajoutant des instructions SQL malveillantes aux paramètres existants. Cela est souvent connu sous le nom d’attaque par injection de code SQL. Une partie du code de comportement de serveur créé par Dreamweaver doit être modifiée afin de réduire le risque d’attaques par injection de code SQL. Pour obtenir des informations supplémentaires sur les attaques par injection de code SQL, voir cet article Wikipedia.

Remarque : le problème décrit dans cet article a été corrigé dans Dreamweaver 8.0.2 Updater.

Solution : mettez à jour les comportements de serveur

Lorsque vous laissez une chaîne de requête transmettre un paramètre, assurez-vous que seules les informations attendues sont transmises. Adobe a créé Dreamweaver 8.0.2 Updater afin de réduire le risque d’attaques par injection de code SQL. Ces correctifs sont intégrés à toutes les versions suivantes de Dreamweaver. Après la mise à jour de Dreamweaver 8, vous devrez réappliquer les comportements de serveur aux pages qui les utilisent, puis redéployer ces pages sur le serveur.

La suite de ce document décrit comment modifier manuellement le code Dreamweaver MX 2004 afin d’empêcher les attaques par injection de code SQL avec le modèle de serveur ColdFusion. Les comportements de serveur qui sont concernés par ces attaques sont répertoriés ci-dessous, ainsi que les correctifs :

Jeu d’enregistrements avec un filtre

Les jeux d’enregistrements non filtrés n’ont pas besoin d’être modifiés, au contraire des jeux d’enregistrements filtrés. Dans l’exemple ci-dessous, un jeu d’enregistrements Dreamweaver MX 2004 nommé « Recordset1 » est filtré par une valeur d’ID transmise à partir d’un paramètre d’URL. Le code mis en évidence ci-dessous doit être modifié :

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>

Pour protéger le jeu d’enregistrements contre les attaques par injection de code SQL, utilisez la balise cfqueryparam dans la balise cfquery contenant l’instruction SQL SELECT. La balise cfqueryparam vérifie le type de données du paramètre de requête et permet de protéger vos bases de données des utilisateurs non autorisés. La ligne en jaune est le code sécurisé modifié :

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Comportements de serveur d’insertion d’enregistrement et assistant de formulaire d’insertion d’enregistrement

Pour protéger le jeu d’enregistrements contre les attaques par injection de code SQL, utilisez la balise cfqueryparam dans la balise cfquery contenant l’instruction SQL INSERT. La balise cfqueryparam vérifie le type de données du paramètre de requête et permet de protéger vos bases de données des utilisateurs non autorisés.

Code d’origine. Le code mis en évidence ci-dessous doit être modifié :

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif>   )</cfquery>

Code sécurisé modifié :

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif>   )</cfquery>

Remarque : sélectionnez les valeurs cfslqtype et maxlength appropriées pour vos données.

Mise à jour d’enregistrement et assistant de formulaire de mise à jour des enregistrements

Le comportement de serveur de mise à jour d’enregistrement et l’assistant de formulaire de mise à jour des enregistrements nécessitent une combinaison des correctifs ci-dessus. Tout d’abord, recherchez la requête cfquery contenant l’instruction SQL SELECT et modifiez-la comme décrit à la section Jeu d’enregistrements avec un filtre. Ensuite, recherchez la requête cfquery contenant l’instruction SQL SELECT et modifiez-la comme décrit à la section Comportements de serveur d’insertion d’enregistrement et assistant de formulaire d’insertion d’enregistrement.

Comportement de serveur de suppression d’enregistrement

La modification du comportement de serveur de suppression d’enregistrement est similaire à celle de Jeu d’enregistrements avec un filtre.

Code d’origine :

<cfquery datasource="cafetownsend">    DELETE FROM COMMENTS    WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>

Code sécurisé modifié :

<cfquery datasource="cafetownsend">   DELETE FROM COMMENTS   WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Remarque : sélectionnez les valeurs cfslqtype et maxlength appropriées pour vos données.

Comportement de serveur de connexion de l’utilisateur

Pour corriger le code de comportement de serveur de connexion de l’utilisateur, recherchez les balises cfquery et ajoutez des balises cfqueryparam.

Code d’origine :

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#'   AND LAST_NAME='#FORM.textfield2#'</cfquery>

Code sécurisé modifié :

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50">   AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>

Remarque : sélectionnez les valeurs cfslqtype et maxlength appropriées pour vos données.

Comportement de serveur de vérification de nouvel utilisateur

Le comportement de serveur de vérification de nouvel utilisateur nécessite au préalable l’ajout d’un comportement de serveur d’insertion d’enregistrement à la page. Tout d’abord, recherchez la requête cfquery contenant l’instruction SQL SELECT et modifiez-la comme décrit à la section Jeu d’enregistrements avec un filtre. Ensuite, recherchez la requête cfquery contenant l’instruction SQL INSERT et modifiez-la comme décrit à la section Comportements de serveur d’insertion d’enregistrement et assistant de formulaire d’insertion d’enregistrement.

Ensemble de maquettes de détails

Pour l’objet d’application d’ensemble de maquettes de détails, les modifications concernent principalement le jeu d’enregistrements que Dreamweaver crée pour la page de détails. Si vous ne disposez pas d’un jeu d’enregistrements filtré dans la maquette, celle-ci ne requiert aucune modification. Si vous disposez d’un jeu d’enregistrements filtré sur la maquette, voir Jeu d’enregistrements avec un filtre afin de mettre à jour le code du jeu d’enregistrements.

Pour la page de détails, recherchez la requête cfquery contenant l’instruction SQL SELECT et modifiez-la comme décrit à la section Jeu d’enregistrements avec un filtre.

Informations supplémentaires

Adobe vous recommande d’utiliser la balise cfqueryparam dans chaque balise cfquery pour protéger vos bases de données des utilisateurs non autorisés. Pour plus de détails, voir :

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne