Diffèrences htmlentites, mysql_real_escape_string...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Diffèrences htmlentites, mysql_real_escape_string...

Re: Diffèrences htmlentites, mysql_real_escape_string...

par Ryle » 19 févr. 2011, 11:09

En théorie, il faudrait comme d'indique moogli, limiter l'utilisation du javascript pour être sur d'être compatible quelque soit la configuration du navigateur. Cependant depuis l'arrivée d'ajax et d'un nombre croissant de librairies javascript, les utilisateurs qui désactivent volontairement javascript sont de moins en moins nombreux car ils se privent de l'accès à un grand nombre de sites et de fonctionnalités...

Le header est utile dans le cas d'une redirection automatique (et pour qu'il fonctionne il ne faut strictement rien envoyer au navigateur avant de faire appel au header... donc non applicable si tu veux afficher un message de confirmation avant de rediriger l'utilisateur)

Pour une redirection automatique côté utilisateur et sans javascript, tu peux également utiliser le meta refresh en html :)

Re: Diffèrences htmlentites, mysql_real_escape_string...

par TRUNCKS » 19 févr. 2011, 08:49

Merci beaucoup pour tes précieux conseils !!

En fait concernant le javascript, j'ai fait cela car je n'ai trouvé aucune solution qui fonctionnait pour le remplacer.

Avec les header j'avais des erreurs :(
Concrètement et à ma grande frustration, je n'ai pas réussis à faire une redirection automatique avec autre chose.

Re: Diffèrences htmlentites, mysql_real_escape_string...

par moogli » 18 févr. 2011, 21:11

salut

- if(isset mysql_real_escape_string($_POST['action']))){ <= heu y aune boulette la
Avertissement

isset() fonctionne uniquement avec des variables car l'utilisation de toute autre chose aura comme conséquence une erreur d'analyse. Pour vérifier si une constants est définie, utilisez la fonction defined().
donc if (isset ($_POST['action']))

- le isset est à faire aussi sur les 3 autres valeurs fournie par ton formulaire (tu ne peut être certain qu'elles existeront à l’exécution du script.
-$sq="select pseudo from membre where pseudo=\"$pseudo_membre\""; il est préférable d'utiliser la concaténation c'est un poil plus clair; de plus php peut ne pas trouver la bonne variable (où d'oit il s'arreter ? au "_" ou après ?)
donc $sq='select pseudo from membre where pseudo=\''.$pseudo_membre.'\'';
ou $sq="select pseudo from membre where pseudo=\"${pseudo_membre}\""; si tu tiens au " pour délimiter la chaine.
Il faut aussi savoir que la norme sql indique des ' pour délimiter une chaine de caractère et non des " même si ici cela fonctionne (si tu change de SGBD ça ne fonctionnera pas forcément, essai avec sql Server par exemple ;)).

- mysql_pconnect c'est a oublier, tu n'a pas forcément besoin d'une connection constante et cela peut engendrer des problèmes (certain hébergeur limite le nombre de connection simultanée au sgbd comme fera tu si ton site est pas mal visité ?)
- pour la dernière partie non pas de htmlentities sinon tu va afficher les balises et pas un formulaire ... d'ailleur elle devrait même pas être dans un echo, vu qu'il n'y a pas de php avec autant simplement le mettre hors d'un passage php
<?php
// blabla
else {
?>
<form ...> ....</form>
<?php
}
?>

- Perso je ne suis pas fan du javascript dans ce que tu en fait, il suffit de ne pas avoir activer JS pour ne pas avoir la redirection ;)
deplus étant donné que le formulaire est sur la même page que la validation pourquoi ne pas profiter de la chose pour ré afficher le formulaire avec les infos déjà saisie et si tous est validé tu redirige vers une autre page avec header :)

@+

PS : utilise les balises bbcode pour poster du code c'est plus lisible ;)

Re: Diffèrences htmlentites, mysql_real_escape_string...

par TRUNCKS » 18 févr. 2011, 14:25

Bonjour,

J'ai fait ceci, j'aurais aimé savoir si c'est correct où si il manque des choses:

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Espace membre</title> </head> <body> <font face="Verdana" size="2"> <center> <?php require("conf.php"); $conn = mysql_pconnect($sql_serveur, $sql_user, $sql_passwd) or trigger_error(mysql_error(),E_USER_ERROR); mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error()); mysql_select_db($sql_bdd, $conn); if(isset mysql_real_escape_string($_POST['action']))){ // Récupération des variables nécessaires au mail de confirmation $mail_membre = mysql_real_escape_string($_POST['mail']); $pseudo_membre = mysql_real_escape_string($_POST['pseudo_membre']); $passe_membre = mysql_real_escape_strings($_POST['passe_membre']); $actif='0'; // Génération aléatoire d'une clé $cle = md5(microtime(TRUE)*100000); // TEST SUR LES VALEURS SAISIES if($pseudo_membre=="") {echo htmlentities("Vous devez choisir un pseudo<br><br><a href=\"javascript:window.history.back()\">Retour</a>");exit;} if($passe_membre=="") {echo htmlentities("Vous devez choisir un mot de passe<br><br><a href=\"javascript:window.history.back()\">Retour</a>");exit;} // CHAMPS SUPLEMENTAIRES, inspirez-vous des lignes suivantes. Pour qu'un champs soit facultatif, omettez la ligne. if($mail_membre=="") {echo htmlentities("Vous n'avez pas saisi votre email<br><br><a href=\"javascript:window.history.back()\">Retour</a>");exit;} // ON VERIFIE SI CE PSEUDO EXISTE DEJA $sq="select pseudo from membre where pseudo=\"$pseudo_membre\""; $requete=mysql_query($sq ) or die('erreur sq1: '.mysql_error()); $num=mysql_num_rows($requete); if($num!=0) { echo htmlentities("Ce pseudo existe déjà, veuillez en choisir un autre<br><br><a href=\"javascript:window.history.back()\">Retour</a>"); } /**/ else { // CREATION D'UN IDENTIFIANT ALEATOIRE $taille = 20; $lettres = "abcdefghijklmnopqrstuvwxyz0123456789"; srand(time()); for ($i=0;$i<$taille;$i++) { $id.=substr($lettres,(rand()%(strlen($lettres))),1); } // INSERTION DANS LA TABLE $sq2="insert into membre values ('',\"$id\",\"$pseudo_membre\",\"$passe_membre\",\"$mail_membre\",\"$cle\",\"$actif\")"; $quer2=mysql_query($sq2 ) or die('erreur sq2: '.mysql_error()); //ma methode echo htmlspecialchars("Vos informations ont bien été enregistrées. Un mail de confirmation va vous parvenir d'ici quelques minutes. Veuillez confirmer votre inscription pour pouvoir commencer à utiliser votre compte."); // Préparation du mail contenant le lien d'activation $destinataire = $mail_membre; $sujet = "Activer votre compte" ; $entete = "From: [email protected]" ; // Le lien d'activation est composé du login(log) et de la clé(cle) $message = 'Bienvenue sur Site, Pour activer votre compte, veuillez cliquer sur le lien ci dessous ou copier/coller dans votre navigateur internet. http://site.com/validation.php?log='.urlencode($pseudo_membre).'&cle='.urlencode($cle).' --------------- Ceci est un mail automatique, Merci de ne pas y répondre.'; mail($destinataire, $sujet, $message, $entete) ; // Envoi du mail } } /*-----------------------------------------------------------------*/ /* AFFICHAGE DU FORMULAIRE */ /*-----------------------------------------------------------------*/ else{ echo "<h2>Nouveau membre</h2> <form action=\"adduser.php\" method=\"post\"> <input type=\"hidden\" name=\"action\" value=\"add\"> Chosissez un pseudo<br><input type=\"text\" name=\"pseudo_membre\"><br> Chosissez un mot de passe<br><input type=\"password\" name=\"passe_membre\"><br> Votre email<br><input type=\"text\" name=\"mail\"><br> <br> <input type=\"submit\" value=\"Envoyer\"> </form> <br> <font face=\"Verdana\" size=\"2\"><a href=\"index.htm\">Se connecter</a></font>"; } ?> </center> </font> </body> </html>

Cette partie là ( à la fin ) doit elle être sous htmlentities ?

Code : Tout sélectionner

echo "<h2>Nouveau membre</h2> <form action=\"adduser.php\" method=\"post\"> <input type=\"hidden\" name=\"action\" value=\"add\"> Chosissez un pseudo<br><input type=\"text\" name=\"pseudo_membre\"><br> Chosissez un mot de passe<br><input type=\"password\" name=\"passe_membre\"><br> Votre email<br><input type=\"text\" name=\"mail\"><br> <br> <input type=\"submit\" value=\"Envoyer\"> </form> <br> <font face=\"Verdana\" size=\"2\"><a href=\"index.htm\">Se connecter</a></font>";

Re: Diffèrences htmlentites, mysql_real_escape_string...

par stealth35 » 18 févr. 2011, 12:31

Ma dernière question, c'est sur un echo d'un POST/GET c'est ça ?

Où il faut également le mettre sur un echo $variable ?
oui aussi :wink:

Re: Diffèrences htmlentites, mysql_real_escape_string...

par TRUNCKS » 18 févr. 2011, 12:29

Ma dernière question, c'est sur un echo d'un POST/GET c'est ça ?

Où il faut également le mettre sur un echo $variable ?

Re: Diffèrences htmlentites, mysql_real_escape_string...

par stealth35 » 18 févr. 2011, 12:18

je suis plus partisan du htmlspecialchars que de htmlentities, avec htmlentities il risque d'y avoir des soucis avec les caractères accentués

Re: Diffèrences htmlentites, mysql_real_escape_string...

par xTG » 18 févr. 2011, 12:14

htmlentities() dans un cas comme celui là :
echo htmlentities($_POST['pseudo']);

Re: Diffèrences htmlentites, mysql_real_escape_string...

par TRUNCKS » 18 févr. 2011, 12:08

Merci pour ta réponse :)

Donc escape string lors d'un post/get

htmlentities lors d'un echo c'est ça ?
Où de manière générale dès que l'on affiche quelque chose entré dans un formulaire ?

Re: Diffèrences htmlentites, mysql_real_escape_string...

par xTG » 18 févr. 2011, 12:00

htmlentities ne s'utilise pas lors de l'insertion en bdd.
Mais sert à éviter les injections de code à l'affichage. ;)

Par contre mysql_real_escape_string elle sert à empêcher les injections SQL.

Donc la première lors de l'affichage, et la seconde lors de l'utilisation en requête.

Diffèrences htmlentites, mysql_real_escape_string...

par TRUNCKS » 18 févr. 2011, 10:23

Bonjour,

Je viens de m'attaquer à la sécurité des formulaires et des bases SQL.
Je n'y comprenais un peu rien mais à force de lire c'est devenu un peu plus clair.

Mais du coup j'ai vu des tas de façon de faire et je ne sais pas trop comment commencer.

Deja ma première question, on sécurise uniquement au POST/GET où il faut également sécuriser le champ formulaire.
( ex: <form action=\"adduser.php\" method=\"post\">)

Après donc, quoi utiliser ?
htmlenties, escape_string, les deux, j'en ai vu pas mal de diffèrents.

Il y a l'attaque par injection SQL, mais j'ai lu aussi qu'on pouvait entrer du html dans un champ formulaire pour y injecter du code.

J'aimerai en fait un petit résumé rapide de quoi sécuriser et avec quoi, je suis un peu perdu en fait.
J'ai tellement lu de trucs différents que je ne sais pas quel est la meilleur manière de faire.