Injection SQL
Injection SQL
Bonjour,
J'ai actuellement un gros problème de sécurité sur mon formulaire. On m'a dit que l'on pouvait de l'injection SQL...
Comment tester si c'est bien le cas ?
Et comment s'en protéger ?
J'ai un champ textarea où l'utilisateur peut saisir de l'HTML (c'est normal car ce champ permettra d'afficher ce code HTML dans la page. Celui-ci est enregistré dans une base MySQL et affiché ensuite dans la page...
Comment faire ?
Je suis un peu perdu...
Merci de m'aider.
Cordialement.
Renaud.
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
J'ai actuellement un gros problème de sécurité sur mon formulaire. On m'a dit que l'on pouvait de l'injection SQL...
Comment tester si c'est bien le cas ?
Et comment s'en protéger ?
J'ai un champ textarea où l'utilisateur peut saisir de l'HTML (c'est normal car ce champ permettra d'afficher ce code HTML dans la page. Celui-ci est enregistré dans une base MySQL et affiché ensuite dans la page...
Comment faire ?
Je suis un peu perdu...
Merci de m'aider.
Cordialement.
Renaud.
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Il y a une petite explication sur ce que ça veut dire sur Wikipédia : http://fr.wikipedia.org/wiki/Injection_SQL
Pour s'en protéger, en supposant que tu utilises PHP, il faut vérifier que l'option magic_quotes_gpc soit bien activée. Si ce n'est pas le cas, utiliser la fonction addslashes sur tous les champs de formulaires que tu reçois.
Pour s'en protéger, en supposant que tu utilises PHP, il faut vérifier que l'option magic_quotes_gpc soit bien activée. Si ce n'est pas le cas, utiliser la fonction addslashes sur tous les champs de formulaires que tu reçois.
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Li tens revient, je ne fais riens. ♪
Oui mais le addslashes c'est bien pour l'insertion SQL.
Par contre, si l'info stockée avec addslashes dans la bdd est récupérée puis affichée dans la page avec stripslashes alors le code sera exécuté lors de l'affichage, non ?
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Par contre, si l'info stockée avec addslashes dans la bdd est récupérée puis affichée dans la page avec stripslashes alors le code sera exécuté lors de l'affichage, non ?
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Non, à l'affichage tu as un "select", donc rien ne sera inséré dans ta base de données. Tu récupèrera simplement un utilisateur nommé "dupont\' -- ". À ce moment, tu enlèves le \ et comme tu es en php, ta base ne risque plus rien.
Une autre solution est de mettre une contrainte "not null" dans le champ mot de passe : la requête frauduleuse sans mot de passe échouera lamentablement.
Bref, maintenant que tu as l'idée, à toi de tester où exactement est-ce que ta base est vulérable, et de voir si (en fait : que) la solution proposée résout bien le problème
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.4) Gecko/20060508 Firedragon Firefox/1.5.0.4
Une autre solution est de mettre une contrainte "not null" dans le champ mot de passe : la requête frauduleuse sans mot de passe échouera lamentablement.

Bref, maintenant que tu as l'idée, à toi de tester où exactement est-ce que ta base est vulérable, et de voir si (en fait : que) la solution proposée résout bien le problème

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.4) Gecko/20060508 Firedragon Firefox/1.5.0.4
Il te faut filtrer la totalité de ce que tu reçois dans tes formulaires, et traiter suivant ce que tu es sensé recevoir.
Filtrer, c'est par exemple :
- tu attends un entier, convertis ce que tu reçois avec (int).
- tu attends une valeur parmi 'rouge', 'bleu', 'vert', vérifie que c'est le cas.
- tu attends une url, vérifie là, il ya plusieurs outils comme pathinfo(), ou basename() si tu attend un nom de fichier, avec lequel tu peux contruire toi même une url.
- du texte sans html ou code php dedans, applique strip_tags().
- les expressions rationnelles te permettent aussi de filtrer énorménent.
- ...
Pour stocker sans problème tes données dans une base, il faut échapper ces données, avec addslashes comme proposé par Benoit, ou mieux avec les fonctions dédiées de cette base si elles existent, par exemple mysql_real_escape_string() ou mysql_escape_string() pour mysql, ou sqlite_escape_string() pour sqlite. Avant d'appliquer ces fonctions vérifie (avec get_magic_quotes_gpc()) si les magic quotes sont activées, si oui applique d'abord stripslashes (sinon tu vas stocker des slashs).
Et quand tu te sers de tes données issues de ta base, applique les traitements nécessaires, par exemple htmlentities() ou htmlspecialchars() si tu dois afficher du texte sans tag html.
Il faut juste (facile à dire
) essayer d'être maitre de son code et de ses données...
Filtrer, c'est par exemple :
- tu attends un entier, convertis ce que tu reçois avec (int).
- tu attends une valeur parmi 'rouge', 'bleu', 'vert', vérifie que c'est le cas.
- tu attends une url, vérifie là, il ya plusieurs outils comme pathinfo(), ou basename() si tu attend un nom de fichier, avec lequel tu peux contruire toi même une url.
- du texte sans html ou code php dedans, applique strip_tags().
- les expressions rationnelles te permettent aussi de filtrer énorménent.
- ...
Pour stocker sans problème tes données dans une base, il faut échapper ces données, avec addslashes comme proposé par Benoit, ou mieux avec les fonctions dédiées de cette base si elles existent, par exemple mysql_real_escape_string() ou mysql_escape_string() pour mysql, ou sqlite_escape_string() pour sqlite. Avant d'appliquer ces fonctions vérifie (avec get_magic_quotes_gpc()) si les magic quotes sont activées, si oui applique d'abord stripslashes (sinon tu vas stocker des slashs).
Et quand tu te sers de tes données issues de ta base, applique les traitements nécessaires, par exemple htmlentities() ou htmlspecialchars() si tu dois afficher du texte sans tag html.
Il faut juste (facile à dire

Tu laisses mettre n'importe quoi comme HTML?
J'espère que tu n'autorise qu'un sous-ensemble d'html et que tu contrôle avant de le rebalancer sur une page publique...
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
J'espère que tu n'autorise qu'un sous-ensemble d'html et que tu contrôle avant de le rebalancer sur une page publique...
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
La liberté n'est jamais accordée de bon gré par l'oppresseur; elle doit être exigée par l'opprimé (Martin Luther King).
Les convictions sont des ennemis de la vérité plus dangereux que les mensonges. (Nietzsche).
Native Mozillian.
Les convictions sont des ennemis de la vérité plus dangereux que les mensonges. (Nietzsche).
Native Mozillian.
Cela veut dire qu'un posteur peut faire exécuter des scripts sur les clients de tes visiteurs...
Tu vas vite être complices de pirates...
Il te faut soit interdire le HTML (et passer par un truc plus simple comme le bbcode) soit écrire une fonction qui ne laisse que quelques balises (<B>, <I> par exemple) passer au travers.
Pas fondamentalement difficile mais fastidieux.
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Tu vas vite être complices de pirates...
Il te faut soit interdire le HTML (et passer par un truc plus simple comme le bbcode) soit écrire une fonction qui ne laisse que quelques balises (<B>, <I> par exemple) passer au travers.
Pas fondamentalement difficile mais fastidieux.
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
La liberté n'est jamais accordée de bon gré par l'oppresseur; elle doit être exigée par l'opprimé (Martin Luther King).
Les convictions sont des ennemis de la vérité plus dangereux que les mensonges. (Nietzsche).
Native Mozillian.
Les convictions sont des ennemis de la vérité plus dangereux que les mensonges. (Nietzsche).
Native Mozillian.
Cà dépend de ce que tu fais de ce html par la suite...Romuald P a écrit :Oui mais tu ne réponds pas à la question car le texte saisi dans le formulaire est du HTML...
Pour l'insérer dans ta base, correctement addslashé tu empêches une injection sql.
Je suppose que tu vas l'afficher par la suite, auquel cas tu peux filtrer les balises que tu autorises avec strip_tags(), aprés avoir vérifier que le code est valide...
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité