recherche_webmaster Posté 23 Août 2005 Posté 23 Août 2005 Bonjour, J'ai (presque) terminé mon premier site dynamique. Je n'ai rien fait de spécial pour insérer les données dans la base : l'utilisateur remplie un formulaire et la requête envoit tout dans la base. Puis je la récupère et je l'affiche. ça fonctionne très bien ma foi. Mais ne devrais-je pas utiliser quelques fonctions PHP pour échapper les guillemets par exemple, comme j'ai pu le lire? Si oui, pourquoi puisque ça fonctionne comme ça ? Attention je ne parle pas de la sécurité et du filtrage des données, ça je vais le mettre en place c'est un autre problème. Je parle juste d'échapper les guillemets ou d'autres choses du même genre dont vous avez le secret. Merci pour vos conseils.
TheRec Posté 23 Août 2005 Posté 23 Août 2005 (modifié) Bonsoir, effectivement, si tu souhaites éviter des injections SQL (oui tu le souhaites ! ), il faut procéder comme ceci. Personnellement j'ai écrit ces fonctions et je les utilise en général pour toutes mes requêtes SQL basées sur des données en provenance des utilisateurs. J'ai eu des occasions de les poster prédécemment mais on m'a souvent devancer..alors c'est pour cette fois function sqlString($text) { if(is_null($text)) { return 'NULL'; } else { if(function_exists('mysql_real_escape_string')) { return '\''.mysql_real_escape_string($text).'\''; } elseif(function_exists('mysql_escape_string')) { return '\''.mysql_escape_string($text).'\''; } else { return '\''.addslashes($text).'\''; } } }function sqlNumber($number) { if(!is_numeric($number)) return 'NULL'; else return str_replace(',', '.', (string) $number); }function sqlTrueFalse($value) { if(empty($value) || !is_numeric($value)) return 0; else return 1; } La dernière est a modifier selon les cas, elle retroune toujours une valeur, tu peux estimer que si la vlaeur testée n'est pas numérique (par exemple "true" ou même autre chose) cela applique la valeur NULL..mais j'ai pour habitude de toujours donner du pouvoir au valeur "VRAI" et ne pas donner de pouvoir au "FAUX", donc si la valeur n'est pas renseignée ou n'est pas ce que j'attends elle est mise à faux, à toi de voir comment tu souhaite les utiliser... **EDIT** Si Dan passe dans le coin, la CODEBOX me jour le même tour que la dernière fois... un petit "white-space: pre;" de pas assez quelque part Modifié 23 Août 2005 par Anonymus
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 ouhla merci pour ta réponse et ton code Therec. Mais une question simple donc : Si je ne filtre RIEN, hormis le piratage bien sur, qu'est ce que je risque? Les "" vont-ils me poser problèmes ?
Anonymus Posté 23 Août 2005 Posté 23 Août 2005 Pour le savoir, testes toi même. Lorsque tu as une boite de dialogue (input type=text, par exemple), essaies systématiquement de mettre 2 apostrophes, puis des apostrophes doubles, et... tous les caractères bizarres qui te tombent sous la main ($ \ / " ' `etc... ) et essaies aussi d'y mettre du code html (type <a href=''>coucou</a>) tu verras bien ce que ca donne, et si le résultat est celui attendu
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 (modifié) et bien justement je viens d'essayer avec des "" puisque sur un autre forum quelqu'un m'a agressé en me disant que ça allait me faire des bugs partout. Et bien donc je viens d'essayer et ça ne pose aucun problème, les "" s'affichent bien partout sans bug nulle part. Comment ça se fait alors? edit: je vais réessayer avec les caractères douteux évoqués ci dessus, je reviens dans 5 mn. Modifié 23 Août 2005 par recherche_webmaster
TheRec Posté 23 Août 2005 Posté 23 Août 2005 (modifié) C'est la magie des magic_quotes, ton serveur, ou plutôt le moteur PHP a ajouté de lui-même les "\" nécessaires grâce au système magic_quotes décrit ici : http://www.php.net/magic_quotes Modifié 23 Août 2005 par TheRec
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 (modifié) oui alors hum Je viens d'entrer ça dans le formulaire, pour voir : l'apostrphoe <a href="http://www.bob.com">coolos</a>voilà ce que j'en dit \ça vous la +cuope hein ??#* C'est idiot mais c'est pas le sujet. Donc je le récupère dans l'admin, ça s'affiche tel quel. Je le revalide pour qu'il apparaissent sur le site et là, oh surprise toute la page est archi décentrée sur la droite et s'affiche en haut à gauche, dans le vide donc : l'apostrphoe <a href="http://www.bob.com">coolos</a>voilà ce que j'en dit \ça vous la +cuope hein ??#*"> Et le message s'affiche aussi dans la page à l'endroit voulu, avec le lien prêt à cliquer. Il s'est passé quoi? Qu'est ce qui déclenchent ça? Modifié 23 Août 2005 par recherche_webmaster
Anonymus Posté 23 Août 2005 Posté 23 Août 2005 Si le message s'affiche 2 fois, c'est parce que tu as demandé à ce qu'il s'affiche 2 fois. C'est un programme, pas un magicien Si tu utilises un champ 'textarea', tu vas avoir des problèmes de caractères spéciaux, tel que \n. Pour cela, il te faut convertir les sauts de ligne par des 'breaks', soit : $txt = nl2br($txt); aura pour effet de convertir le caractère spécial de nouvelle ligne en balise html <br> Voilà.
TheRec Posté 23 Août 2005 Posté 23 Août 2005 Hors du contexte de ton site c'est assez dur de voir /c'est à dire sans le code sous les yeux)... Comment affiches-tu le texte entré par le formulaire dans la page qui pose problème ? Es-tu sur que les données dont celle que tu souhaite, vérifie directement dans la base de données (avec phpMyAdmin ou autre)... Es-tu sûr qu'il n'y a pas d'erreur lors l'insertion ?
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 Si tu utilises un champ 'textarea', tu vas avoir des problèmes de caractères spéciaux, tel que \n. Pour cela, il te faut convertir les sauts de ligne par des 'breaks', soit :$txt = nl2br($txt); je comprend pas de toute façon quand l'utilisateur va à la ligne dans le champ textarea de toute façon ça ne change rien le message s'affiche sans aucun changement de ligne nulle part. ce serait d'ailleur une chose à faire, avec un mini éditeur de texte non?
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 Comment affiches-tu le texte entré par le formulaire dans la page qui pose problème ? avec une requette SELECT, ça marche très bien pour toutes les pages. Es-tu sur que les données dont celle que tu souhaite, vérifie directement dans la base de données (avec phpMyAdmin ou autre)... ça affiche ce que ça doit à l'endroit voulu, mais en plus à un endroit saugrenu en haut à gauche en poussant toute la page vers la droite. Es-tu sûr qu'il n'y a pas d'erreur lors l'insertion ? Aucune erreur puisque ça fonctionne bien d'habitude, mais pas de filtrage non plus, c'est d'ailleur l'objet de ce post.
Anonymus Posté 23 Août 2005 Posté 23 Août 2005 Ce qu'il faut que tu regardes, c'est le code source de ta page html, et non l'affichage à l'écran ! Regardes, dans ce que tu as posté plus haut : l'apostrphoe <a href="http://www.bob.com">coolos</a>voilà ce que j'en dit \ça vous la +cuope hein ??#*"> A la fin, tu as 2 caractères de plus. Ces caractères, ils ne sont pas entrés par toi ? C'est qu'ils viennent d'ailleurs. Cherches dans le code source pourquoi ils sont là, ce qui ne marche pas, et pourquoi ca ne marche pas.
TheRec Posté 23 Août 2005 Posté 23 Août 2005 Que se passe-t-il si tu édites le champ dans la base de données et que tu enlèves tous les caractères sources potentielles du problème (l'affichage à double) ? Si cela ne règle pas le problème je te conseille une petite vérification de ton code..tu as sûrement un echo ou un print quelque part ...sûrement un ancien test de ta part..ça arrive souvent
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 A la fin, tu as 2 caractères de plus Non dsl j'ai exactement la même chose j'ai juste copie/collé un bout de code de trop. Non le problème c'est une simple histoire de filtrage des caractères spéciaux. Mais lesquels dans mon exemple ont déclenché le problème selon vous? Et donc comment y remédier ?
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 (modifié) Que se passe-t-il si tu édites le champ dans la base de données et que tu enlèves tous les caractères sources potentielles du problème (l'affichage à double) ? Bien ça va fonctionner puisque j'ai dit que mon code fonctionne très bien. La question c'est lequel de ces caractères spéciaux m'a déclenché une erreur selon vous puisque les simples "" ne déclenchent pas d'erreur. Bon je vais essayer de toute façon mais ça devrait vous sauter aux yeux non ? Modifié 23 Août 2005 par recherche_webmaster
TheRec Posté 23 Août 2005 Posté 23 Août 2005 Mais sâche PHP n'affiche pas des données pour le plaisir, il le fait sur ta demande..donc vérifie quelle commande (sûrement un echo ou un print) affiche cette "deuxième" fois En même temps j'ai lu "mon code fonctionne très bien"... et là ce qui me "saute aux yeux" c'est que si c'était le cas il n'afficherait pas deux fois le texte
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 mon code fonctionne très bien il n'y a pas d'echo qui traine il n'y a pas de print qui traine non plus Sinon ça le ferait dans d'autres cas d'ailleurs. Donc c'est dû aux caractères spéciaux que j'ai entré pour le test. Bon je vais tous les filtrers avec un marteau comme ça ça sera réglé alors. Donc c'est quoi la solution? pilonner au stripslash ou un truc comme ça?
Anonymus Posté 23 Août 2005 Posté 23 Août 2005 Non, la solution, c'est d'enlever l'écho qui fait l'affichage. Il y a fort à parier que l'affichage se fasse tout de même, ce qui signifierait bien qu'il y a un second echo (ou print) qui traine quelque part. Essaies, merci
TheRec Posté 23 Août 2005 Posté 23 Août 2005 (modifié) Mais le problème avec ces caractères échapés ne se trouve pas dans l'affichage... ils résident dans le fait qu'insérer des données non échapées dans la base crée des failles suivant les cas. L'affichage se fait effectivement avec stripslashes pour supprimer les "\" superflus, mais si tu ne le fait pas cela n'empêche pas l'affichage...simplement tu te retrouve avec un texte contenant des "\" inutiles... **EDIT** Oui..même si on a tort tous les deux ...essaies, ça nous fera plaisir Modifié 23 Août 2005 par TheRec
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 (modifié) Non, la solution, c'est d'enlever l'écho qui fait l'affichage. Il y a fort à parier que l'affichage se fasse tout de même, ce qui signifierait bien qu'il y a un second echo (ou print) qui traine quelque part. Non désolé je connais mon code par coeur c'est une succession de fichier require, j'ai le nez dedans depuis un mois du matin au soir. Je sais exactement ce qu'il y a et où. D'ailleur je ne vois pas ce que viendrait faire un echo dans le background de la page, il me générerait plutot une belle erreur. Je vais reprendre mon message test d'en haut en supprimant l'un après l'autre les caractères spéciaux pour savoir lequel déclenche le problème. edit **EDIT** Oui..même si on a tort tous les deux ...essaies, ça nous fera plaisir nan j'essaierai pas y'a pas d'echo balladeur dans mon code. Pk pas un fantôme aussi. Faut aller dormir les gars hein ! Modifié 23 Août 2005 par recherche_webmaster
TheRec Posté 23 Août 2005 Posté 23 Août 2005 (modifié) Bien sur tes conseils avisés je vais dormir et ne plus répondre vu que mon aide t'es si précieuse. Sur ce bonne nuit et je suis ravi d'avoir reçu ma leçon de savoir coder pour ce soir. P.S. (EDIT) : Evite le language SMS comme "pk", c'est interdit dans les règles du forum. D'avance merci. P.S. 2: En même temps enlever les caractères suceptibles de causer ce "problème" c'est ce que je t'ai proposé comme 2ème solution... alors là je ne sais plus si je dois aller dormir... mais je sens que tu vas me dire d'y aller... alors Bonne Nuit ! Modifié 23 Août 2005 par TheRec
recherche_webmaster Posté 23 Août 2005 Auteur Posté 23 Août 2005 En même temps enlever les caractères suceptibles de causer ce "problème" c'est ce que je t'ai proposé comme 2ème solution Bien oui mais entre temps j'ai compris pourquoi Je te souhaite bonne nuit, demain j'essaye ça et si c'est intéressant je vous dirais le résultat Merci
recherche_webmaster Posté 24 Août 2005 Auteur Posté 24 Août 2005 (modifié) Bonjour ! Alors donc j'ai fais mes petits tests voila le topo (rappel: il s'agit d'entrer des balises et caractères spéciaux dans les formulaires sans rien filtrer du tout, pour voir si ça fonctionne) : - Les apostrophes ne posent aucun problème et apparaissent aussi bien l'admin que dans la page après validation. -idem pour les guillemets. -si je place une balise <a> (ou n'importe laquelle j'imagine), alors toute la page se décalle vers la droite (en même temps je m'en fiche on est pas sensé entrer des balises là mais bon...) C'est grave docteur? Vous appeleriez cela comment ? edit: Je viens de voir ça aussi : Si j'entre par exemple"bob" dans un champ input et "bob" dans un champ textarea et bien dans l'admin, ou sur la page, il n'y a plus rien dans le champ input, alors que le contenu du textarea est conservé. Pourquoi svp ? Modifié 24 Août 2005 par recherche_webmaster
recherche_webmaster Posté 24 Août 2005 Auteur Posté 24 Août 2005 bon alors un autre problème maintenant : j'utilise htmlentities, comme ça : <?php $texte=htmlentities($_POST['$texte'])?> Mais rien du tout ne s'insère dans la base. Pourtant je ne crois pas avoir fait de faute de syntaxe. Si ?
recherche_webmaster Posté 24 Août 2005 Auteur Posté 24 Août 2005 (modifié) Bon je termine avec une question pour la forme, vu que tout le monde s'en fiche de ce post: J'ai décidé d'utiliser strip_tags en autorisant seulement certaines balises (<b> <br> etc...). Suis-je à l'abris des météor... des hackers ? Pitié ne me répondez pas "on est jamais assez à l'abri des..." je voudrais juste savoir si avec mon strip_tags je suis déjà bien protégé ou si je peux rajouter quand même un filtre suplémentaire, si oui lequel, ou est-ce que ça suffit? Modifié 24 Août 2005 par recherche_webmaster
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant