|
|
|
|
Configuration: Windows XP Firefox 2.0.0.1 easy php 1.8
normalement le addslashes est suffisant pour ce type de cas.
Tu peux monter ton code ou tu construis ta requette avant de l'exécuter
|
je souhaite pouvoir enregistrer un pseudo avec une apostrophe
Rien qu'à t'endendre dire ça, je peux te dire que ton site a un gros problème de sécurité. A lire d'urgence: injection commandes sql “Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
|
je suis au courant des injections
est en contradiction directe avec ton code: $sqlMemberInfos="INSERT INTO $fdb (id, REGdate, Nickname, Password, Gender, BirthYear, BirthMonth, BirthDay, Country, Email_nick, Email_ISP, Newsletter, MemberURL, AvatarName) VALUES('','$REGdate', '$Nickname', '$CPassword', '$Gender', '$BirthYear', '$BirthMonth', '$BirthDay', '$Country', '$Email_nick', '$Email_ISP', '$Newsletter', '$MemberURL', '$AvatarName')";
$Filter=array("'","<",">","?... C'est une mauvaise façon de filtrer les caractères dangereux. Il me semble qu'en php il y a des fonctions spéciales pour échapper les chaînes destinées aux requêtes SQL. “Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
|
faudrait que je puisse faire le filtrage pour que la validation du pseudo soit effective.
Et pourquoi pas utiliser les expressions régulières pour spécifier exactement les caractères autorisés ? En googlant, je suis tombé sur ça: http://www.htmlcenter.com/tutorials/tutorials.cfm/149/PHP/ if(!preg_match("/[A-Za-z0-9]+$/",$field_name))
ça devrait faire l'affaire. certains caracteres peuvent induire des problemes d'affichage pas vrai, notament en html... Ahum... second danger, le Cross-site scripting. Toute donnée provenant de l'utilisateur soit être échappée avant d'être affichée dans une page HTML. & remplacé par & amp; < remplacé par & lt; et > remplacé par & gt; En entrée: Il ne faut pas raisonner en termes de caractères à filtrer (liste noire) (parcequ'il y aura toujours un caractère auquel tu n'aura pas pensé), mais en terme de caractères autorisés (liste blanche) (par exemple A-Z a-z 0-9). "Entrée" concerne les formulaires, mais aussi les données passées en paramètres dans les URLs. (et tout autre type de données provenant de l'utilisateur). En sortie: Echapper systématiquement les données entrées par l'utilisateur dans les pages web (< > et &). (Il me semble même que php possède en standard des fonctions d'échappement). “Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++
|
et tu as essayé
http://fr2.php.net/manual/fr/function.mysql-real-escape-string.php ? de manière générale tu utilises addslashes (perso pas mon préferé de par son nommage) ou le précédent pour l'entrée en base et tu utilises http://fr3.php.net/htmlspecialchars pour la présentation à l'utilisateur
|
|
Salut.
Si je peux ajouter ma contribution a cette discution déjà bien commencée ;-) -Entre addslashes et mysql_real_escape_string, préférer la fonction mysql. Si elle existe ce n'est pas pour rien (sous-entendu:c'est exprès pour mysql), et il vaut mieux l'utiliser. La norme d'échappemment des caractères en SQL consiste à échapper les apostrophes avec d'autres apostrophes, et les anti-slashs avec d'autres anti-slashs. Par exemple, mysql_real_escape_string('\'') vaut «''». La fonction addslashes ajoute des antislashs avant les apostrophes, les guillemets et les anti-slashs eux-mêmes. Cette fonction ne doit donc pas être utilisée pour stocker des données dans une base car elle n'est pas conforme aux normes. Cependant, certains serveur sont configurés de façon à ce que mysql_real_escape_string ait le même comportement que addslashes. Pour voir si des anti-slashs sont ajoutés automatiquement et les enlever pour l'affichage, tu peux faire ca : if(get_magic_quotes_gpc()) $ValeurNonEchapee=stripslashes($ValeurEchapee); Ensuite, lors de l'insertion dans la BDD (en supposant que ta variable ne contienne pas de caractères échapés) : $RQ='INSERT INTO table (champ) VALUES (\''.mysql_real_escape_string($Variable).'\')'; Tu peux utiliser htmlspecialchars pour remplacer "<",">", et "&" par leurs entités. Ensuite, tu peux entourer tes valeurs de doubles quotes (' " ') dans ta requête, car elles sont transformées en entités par défaut. Avec htmlspecialchars sans option et des quotes pour entourer les valeurs ainsi qu'un mysql_real_escape_string, tu ne devrais pas avoir d'injection sql. a plus Sylvain "Join us now, and share the software. You'll be Free, hackers." |
Voici quelques fonctions que l'utilise beaucoup, ça pourrait t'être utile ^^
Alors j'en suis pas l'auteur mais ça fait tellement longtemp que je les utilise que je me souviens plus qui avait pondu ça ..
//-----------------------------------------------------------------------
// Fonction: varcleaner($message, $slashes=true, $html=true, $trim=true)
// Objet: formate le texte suivant condition
// ----------------------------------------------------------------------
function varcleaner($message, $slashes=true, $html=true, $trim=true) {
if($html) { $message = htmlspecialchars($message); }
if($slashes) { $message = MyAddSlashes($message); }
else { $message = MyStripSlashes($message); }
if($trim) { $message = trim($message); }
return $message;
}
// ----------------------------------------------------------------------
// Fonction: MyAddSlashes($chaine )
// Objet: Ajoute des anti-slash dans une chaîne en fonction
// de la config de php
// ----------------------------------------------------------------------
function MyAddSlashes($chaine ) {
return( get_magic_quotes_gpc() == 1 ? $chaine : addslashes($chaine) );
}
// ----------------------------------------------------------------------
// Fonction: MyStripSlashes($chaine)
// Objet: Supprime les anti-slash d'une chaîne en fonction
// de la config de php
// ----------------------------------------------------------------------
function MyStripSlashes($chaine) {
return( get_magic_quotes_gpc() == 1 ? stripslashes($chaine) : $chaine );
}
// ----------------------------------------------------------------------
// Fonction: MyStripSlashesDB($chaine)
// Objet: Supprime les anti-slash d'une chaîne en fonction
// de la config de mysql
// ----------------------------------------------------------------------
function MyStripSlashesDB($chaine) {
return( get_magic_quotes_runtime() == 1 ? stripslashes($chaine) : $chaine );
}
|
Merci ...merci a tous, que d'avis interessants, ca va me faire gagner du temps tout ca...\0/ |
Bien, je tiens deja a vous remerciez pour les precieuses infos que vous m'avez si gentilment fournis.
J'ai pris en compte vos suggestions et j'ai refais un code complet qui fonctionne tres bien, le filtrage et l'insertion dans la BD se font a merveille et tout les test d'erreurs possibles sont concluants, cela a ete treeeeees long et fastidieux pour tester toutes les possibilites. Mon formulaire d'incription membre utilise 1 page en html avec le formulaire method POST, une page cible en PHP pour le traitement et la validation des donnees et qui inclus une autre page php pour la connection SQL avec ces parametres, et enfin 2 templates modelixe inities egalement par une commande d'inclusion INCLUDE(). Bien, le premier template est utilise pour afficher et informer l'utilisateur des erreurs detectees dans les donnes transmisent par ce dernier, le second fait l'inverse et affiche un recapitulatif des donnes valides et presente un bouton(un formulaire est code dans le template, et le bouton n'a pas de method definie) pour continuer et enregistrer les donnes dans la BD, et pour finir un lien sous le bouton pour revenir au formulaire d'inscription, jusque la pas de soucis. Maintenant avant d'exposer ce qui me tracasse, j'ajoute que l'utilisateur peux choisir une image avatar a mettre sur son profil, ce fichier image est deplace vers un repertoire dedie en dernier dans le script de detection d'erreur, donc si il n'y a aucune erreur le fichier image est deplace. Alors voila ce qui me pose un petit probleme: -Sur le template affichant le bouton, donc celui ou l'utilisateur est informe que tout va bien et qu'il ne reste plus qu'a valider,je voudrais donc ajouter un bouton ou un lien qu permet de revenir a la page d'inscription et de modifier des donnees(pseudo, email ect...). Le hic s'est que pour retrouver les variables $_POST presentent dans leur cases respectives (a part les champs masques), il faut que l'utilisateur presse le bouton retour de son naviguateur, pourquoi pas ? ,mais si l'utilisateur utilise le lien ou un bouton a cet effet la page d'inscription apparait vide lol! vous voyez, et je n'envisage pas que l'utilisateur soit contraint de tout retaper. Alors comment faire ? j'ai essaye pas mal de methode, mais je perd tout le temps les variables $_POST, je n'ai pu les mettre en cache avec pear cache lite et aussi le cache de PHP 5, ce dernier ne peut pas tamporiser des variables $_POST ou autres, seulement leur valeurs respectives, donc les varaibles liees aux $_POST du formulaire devienne nulles quoi que je fasse, j'ai meme penser a un script qui pourrait concatener les valeurs mise en cache pour reconstituer les variables initials, mais je n'ai pas tester cette derniere idee farfelue. J'ajoute que, des lors ou le template de validation apparait la requete SQL est deja executee, ce n'est pas ce que je voulais faire mais etant donne que je perd les variables $_POST je n'est pas pu exploite un autre script qui enregistre seulement si le bouton 'continuer' est presse, l'image avatar est elle aussi deja deplacee dans son repertoire de destination definitif. Voila, donc si mon utilisateur fait un retour sur la page d'inscription avec le bouton retour de son naviguateur, il retrouvera la page remplis avec les infos qui l'avait ulterieurement tape, sauf les donnes masquee, mais le hic s'est que si il modifie la moindre chose, toutes les anciennes donnes plus les nouvelles constituront un nouveau profil qui va generer des erreurs, pseudo deja existant, image avatar deja existante alors que s'est l'utilisateur lui meme qui quelques minutes plus tot l'avait selectionne, le meme topo pour le template qui affiche les erreurs, il faut faire 'retour' avec le naviguateur sinon plus de formulaire remplis. J'espere que vous saississez le probleme, je pourrait continuer avec mon script tel qui est et permettre au nouveau utilisateur de modifier son profile plus loin en se loggant sur le site et en utilisant ca page perso pour revoir et corriger les parametres de son profile, mais il doit bien y avoir une astuce en utilisant uniquement du language PHP pas vrai ? Le script le plus proche de mes attentes utilise une varaiable avec la methode $_GET et transmet un booleen depuis le template pour activer ou pas la requete SQL d'enregistrement des donnees du profiles, qui est codee dans un block a part sur la page PHP de traitement des donnees ,qui necessite ce boloeen pour valider definitivement la requete SQL d'enregistrement, c'est la aussi que je voulais mettre ma routine pour le deplacement de l'image avatar, de cette maniere j'eviterais toutes erreurs possible suite a la revision du formulaire par l'utilisateur, en fait je me casse la tete juste pour donner plus de comfort a l'utilisateur et eviter que si ce dernier revise ces entrees sont image avatar ne soit deja transferee vers sont repertoire de destination qui je le rappel induit une erreur de type 'deja present dans la BD', et donc invalide toute correction meme mineure des donnees du profile de l'utilisateur..bla bla.. Pour resumer: -Y-a-t il une autre methode fiable pour gerer ce genre probleme? -Ne peut-on pas mettre en cache les variables d'un formulaire ? -Peut-on eviter la methode $_GET en ce qui concerne les variables de requete SQL d'insertion ,et dans le besoin de transmettre des valeurs d'une page a une autre ou de retour vers ca page source...? -Le fait de rappeller une page PHP reinitialise-t-il systematiquement toute les variables $_POST et autres traites par cette page ? A l' aide...! 8) |
Salut.
-Peut-on eviter la methode $_GET en ce qui concerne les variables de requete SQL d'insertion Il suffit tout simplement de ne pas utiliser les variables get dans ton code... -Le fait de rappeller une page PHP reinitialise-t-il systematiquement toute les variables $_POST et autres traites par cette page ? Réinitialisées, c'est à dire effacées ? Ca dépend : si le client actualise la page (F5), les données sont renvoyées. S'il clique sur le bouton "ok" à coté de al barre d'adresse, aucune donnée n'est envoyée, c'est comme s'il arrivait sur la page. Pour résoudre ton problème tu as ces solutions : -Utiliser un formulaire sur chaque page ou il est nécéssaire de transmettre les variables, en supposant que le client changera de page avec un input type="submit". Tu peux placer toutes les données dans des hidden : foreach($_POST as $champ=>$donnees) echo'<input type="hidden" name="',$champ,'" value="',$donnes,'" />'; - Utiliser la même page pour valider le formulaire et l'afficher, tout simplement ;-) C'est beaucoup plus simple à mon avis. a plus Sylvain "Join us now, and share the software. You'll be Free, hackers."
|
Tu peux montrer ton code entre les balises code ?
Sylvain
"Join us now, and share the software. You'll be Free, hackers."
|
Résultats pour pseudo avec apostrophe ineserrable dans bd
Résultats pour pseudo avec apostrophe ineserrable dans bd
Résultats pour pseudo avec apostrophe ineserrable dans bd
Résultats pour pseudo avec apostrophe ineserrable dans bd