Aller au contenu

Sujets conseillés

Posté

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.

Posté (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é par Anonymus
Posté

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 ;)

Posté (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é par recherche_webmaster
Posté (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é par TheRec
Posté (modifié)

oui alors hum :boude:

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é par recherche_webmaster
Posté

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 :D

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à.

Posté

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 ?

Posté

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?

Posté

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.

Posté

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.

Posté

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 ;)

Posté

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 ?

Posté (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 ? :whistling:

Modifié par recherche_webmaster
Posté

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 :P

Posté

mon code fonctionne très bien :boude:

il n'y a pas d'echo qui traine :boude:

il n'y a pas de print qui traine non plus :boude:

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?

Posté

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 ;)

Posté (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é par TheRec
Posté (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é par recherche_webmaster
Posté (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é par TheRec
Posté

 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

Posté (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é par recherche_webmaster
Posté

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 ?

Posté (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é par recherche_webmaster

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...