Autoriser les extraits de code dans la saisie de formulaire tout en empêchant les attaques par injection XSS et SQL

StackOverflow https://stackoverflow.com/questions/407771

Question

Comment autoriser la saisie d'extraits de code dans un éditeur (à la manière de stackoverflow), comme FCKeditor ou tout autre éditeur, tout en empêchant XSS, l'injection SQL et les attaques associées.

Était-ce utile?

La solution

Une partie du problème ici est que vous souhaitez autoriser certains types de HTML, n'est-ce pas? Liens par exemple. Mais vous devez supprimer uniquement les balises HTML susceptibles de contenir des attaques XSS, telles que les balises de script ou même des attributs de gestionnaire d'événements, un href ou un autre attribut commençant par & "; Javascript: &"; Une réponse complète à votre question doit donc être plus sophistiquée que & "Remplacer les caractères spéciaux &"; parce que cela ne permettra pas les liens.

La prévention de l’injection SQL peut dépendre quelque peu de votre choix de plate-forme. Ma plate-forme Web préférée a une syntaxe intégrée pour le paramétrage des requêtes qui empêcheront principalement l'injection SQL (appelée cfqueryparam). Si vous utilisez PHP et MySQL, il existe une fonction native similaire mysql_escape (). (Je ne suis pas sûr que la fonction PHP crée techniquement une requête paramétrée, mais cela m’a bien fonctionné pour empêcher les tentatives d’injection SQL jusqu’à présent, car j’en ai vu quelques-unes qui étaient stockées en toute sécurité dans la base de données.)

En ce qui concerne la protection XSS, j’utilisais des expressions régulières pour assainir les entrées pour cette raison, mais je me suis écarté de cette méthode à cause de la difficulté à autoriser des choses comme les liens tout en supprimant le code dangereux. Ce que je suis passé à une alternative est XSLT. Là encore, la manière dont vous exécutez une transformation XSL peut varier en fonction de votre plate-forme. J'ai écrit il y a quelque temps à un article pour le journal du développeur ColdFusion sur la procédure à suivre, qui comprend à la fois une feuillard XSL que vous pouvez utiliser et comment le préparer. travailler avec CF en utilisant la fonction native XmlTransform ().

La raison pour laquelle j'ai choisi de passer à XSLT pour cette raison est double.

Tout d’abord, en validant que l’entrée est bien formée, XML élimine la possibilité d’une attaque XSS utilisant certaines astuces de concaténation de chaînes.

Deuxièmement, il est alors plus facile de manipuler le paquet XHTML avec les sélecteurs XSL et XPath qu'avec les expressions régulières, car ils sont conçus spécifiquement pour fonctionner avec un document XML structuré, par rapport aux expressions régulières conçues pour la manipulation de chaînes brutes. Donc, c'est beaucoup plus propre et plus facile, je suis moins susceptible de faire des erreurs et si je constate que j'ai fait une erreur, il est plus facile de réparer.

De plus, lorsque je les ai testés, j'ai constaté que des éditeurs WYSIWYG tels que CKEditor (il a supprimé le F) conservent du code XML bien formé, vous ne devriez donc pas avoir à vous en préoccuper.

Autres conseils

Les mêmes règles s'appliquent à la protection: entrée de filtre, sortie d'échappement.

Dans le cas d'une entrée contenant du code, le filtrage signifie simplement que la chaîne doit contenir des caractères imprimables, et peut-être que vous avez une limite de longueur.

Lorsque vous stockez du texte dans la base de données, utilisez des paramètres de requête ou échappez la chaîne pour vous assurer que vous ne disposez pas de caractères créant des vulnérabilités d'injection SQL. Le code peut contenir plus de symboles et de caractères non alpha, mais ceux que vous devez surveiller en ce qui concerne l’injection SQL sont les mêmes que pour le texte normal.

N'essayez pas de dupliquer la fonction d'échappement correcte. La plupart des bibliothèques de bases de données contiennent déjà une fonction qui corrige l'échappement pour tous les caractères nécessitant une échappement (par exemple, cela peut être spécifique à la base de données). Il devrait également traiter les problèmes spéciaux avec les jeux de caractères. Utilisez simplement la fonction fournie par votre bibliothèque.

Je ne comprends pas pourquoi les gens disent & "Utiliser des procédures stockées! &"; Les procédures stockées n'offrent aucune protection particulière contre l'injection SQL. Si vous interpolez des valeurs non échappées dans des chaînes SQL et exécutez le résultat, cela risque de provoquer une injection SQL. Peu importe que vous le fassiez en code d’application ou dans un processus stocké.

Lors de la sortie dans la présentation Web, échappez les caractères spéciaux HTML, comme vous le feriez avec n'importe quel texte.

La meilleure chose à faire pour prévenir les attaques par injection SQL est de vous assurer que vous utilisez des requêtes paramétrées ou des procédures stockées lors de vos appels de base de données. Normalement, je vous recommanderais également de procéder à une désinfection de base des entrées, mais comme vous devez accepter le code de l'utilisateur, il se peut que cela ne soit pas une option.

À l'autre extrémité (lors du rendu de l'entrée de l'utilisateur dans le navigateur), le codage HTML des données fera en sorte que tout code JavaScript malveillant ou similaire soit restitué sous forme de texte littéral plutôt que exécuté dans le navigateur du client. Toute infrastructure de serveur d’applications Web décente devrait avoir la capacité.

Je dirais que l'on pourrait remplacer tout < par & amp; lt ;, etc. (en utilisant htmlentities sur PHP, par exemple), puis sélectionnez les balises sûres avec une sorte de liste blanche. Le problème est que la liste blanche est peut-être un peu trop stricte.

Voici un exemple PHP

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

Pour éviter les injections SQL, vous pouvez remplacer tous les caractères 'et \ chars par un " innofensive " équivalent, comme \ 'et \, de sorte que la ligne C suivante

#include <stdio.h>//'); Some SQL command--

N'aurait aucun résultat négatif dans la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top