PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 13-04-2012 11:10:25

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Eviter les injections, mais j'ai une erreur ...

Bonjour à tous,

j'affiche des fiches produits, tout se passe bien puisque si je rajoute un ' ou un ", le résultat s'affiche quand même.
Mais j'ai voulu rajouter un script pour poser des commentaires, et à l'affichage, cette fois, si je rajoute un ' ou ", la fiche produit s'affiche mais j'ai une erreur sur les commentaires, je vois pas du tout quoi faire.


require_once("admin/connexion.php");
$BD_link = mysql_connect("${'BD_host'}${'BD_port'}", $BD_login, $BD_pass) or die("Connexion de la base impossible : ". mysql_error());
mysql_select_db($BD_base, $BD_link) or die("Sélection de la base impossible : ". mysql_error());
//


$_GET['id_produit'] = addslashes ($_GET['id_produit']);

$Requete_SQL2 = "SELECT * FROM commentaire WHERE valid = '1' AND id_produit = $id_produit ORDER BY date DESC ";
mysql_real_escape_string($id_adresse);

$result = mysql_query($Requete_SQL2) or die("Erreur de Sélection dans la base : ". $Requete_SQL2 .'<br />'. mysql_error());
error_reporting(55);  

// creation et affichage de la table
while($val=mysql_fetch_array($result))
if($val["valid"] == 1)
{
$date=$val[date];
$login=$val[login];
$com_pos=$val[com_pos];
$com_neg=$val[com_neg];

echo "<span class=\"texteavis\">Avis : </span><span class=\"textenormal\">";
echo stripslashes($com_pos);

 

Dernière modification par theavengers (13-04-2012 11:21:33)

Hors ligne

#2 13-04-2012 11:21:00

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Re : Eviter les injections, mais j'ai une erreur ...

J'ai oublié de rajouté l'erreur ...


Erreur de Sélection dans la base : SELECT * FROM commentaire WHERE valid = '1' AND id_produit = 2602\' ORDER BY date DESC

PS : je ferais la guerre aux étoiles wink

Dernière modification par theavengers (13-04-2012 11:22:11)

Hors ligne

#3 13-04-2012 13:32:19

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Re : Eviter les injections, mais j'ai une erreur ...

Bon, j'avance, j'ai rajouté des '


$Requete_SQL2 = "SELECT * FROM commentaire WHERE valid = '1' AND id_produit = '$id_produit' ORDER BY date DESC ";
 

Je n'ai plus de message d'erreur, mais les commentaires ne s'affichent pas.

Hors ligne

#4 13-04-2012 13:58:56

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Eviter les injections, mais j'ai une erreur ...

Bonjour,

Je pense que tu n'as pas bien compris à quoi servent les quotes et leur rôles dans MySQL. Les quotes, qu'elles soient simples ou doubles servent à délimiter une chaîne de caractère et donc un champ défini comme tel au sein de la table lue. La fonction addslashes de PHP ne sert qu'à échapper des simples quotes ou des doubles quotes dans une chaîne de caractères pour éviter qu'ils soient confondus avec ceux qui servent à délimiter la chaîne de caractères. A partir de là tu comprendras aisément qu'il est parfaitement inutile de mettre des ids (sauf s'ils sont constitués par une chaîne de caractères) entre simple quotes et encore plus de faire un addslashes('id'). Pour les valeurs numériques un simple typage suffit à les protéger en faisant un simple intval() ou floatval() et à partir de là il n'est plus nécessaire de les entourer de simple quote dans ta requête. Par contre pour ton commentaire il faut absoluement faire par exemple au minimum un addslashes dessus et un stripslashes à la lecture pour éviter les erreurs.

Donc ta dernière requête peut s'écrire (elle ne s'en portera que mieux)

$id_produit=intval($id_produit);
$Requete_SQL2 = "SELECT * FROM commentaire WHERE valid = 1 AND id_produit = $id_produit ORDER BY date DESC ";

Ensuite pour tes commentaires, s'il s'agit de la variable php $com_pos, ton problème ne viens pas de là mais de ton

if($val["valid"] == 1){...

. En effet, il faut savoir que lorsque tu récupères tes données en php toutes les valeurs dans ton resultset sont typées en chaînes de caractères. Pour les exploiter il te faut les retyper. Donc ici pour le faire directement il te faut écrire

if(intval($val['valid'])===1){...

++

Dernière modification par Jc (13-04-2012 14:00:19)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 13-04-2012 14:35:56

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Re : Eviter les injections, mais j'ai une erreur ...

Merci beaucoup pour ces explications. J'avais entre midi et deux intval, mais je ne voyais pas trop la différence. Maintenant effectivement, ça simplifie les choses.

Je vais devoir revoir toutes mes pages car je pense que je me suis laché sur les addslash pour les ids hmm

Pourrais tu me dire la différence entre :


    if(intval($val['valid'])===1){...

 

et


    if(intval($val['valid'])==1){...

 

J'ai testé les deux, et cela fonctionne, mais c'est la 1er fois que je vois ===

Hors ligne

#6 13-04-2012 14:47:30

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Eviter les injections, mais j'ai une erreur ...

Oui bien sûr.

l'opérateur === est un opérateur d'égalité stricte. C'est à dire qu'il va vérifier l'égalité de valeur et de type ou dit différemment il va vérifier que les deux valeurs sont strictement identiques, alors que == va vérifier la simple égalité.

Exemple


0=='0';  //sera vrai
0==='0' // sera faux.
 

Dernière modification par Jc (13-04-2012 14:47:59)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 13-04-2012 14:56:21

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Re : Eviter les injections, mais j'ai une erreur ...

Vraiment merci d'avoir pris le temps pour toutes ces explications big_smile Je corrige immédiatement.

Hors ligne

#8 14-04-2012 06:52:39

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Eviter les injections, mais j'ai une erreur ...

Saluton,
J'en profite pour une petite piqûre de rappel contre les conflits inter-galactiques.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 16-04-2012 16:02:36

theavengers
Membre
Inscription : 13-10-2009
Messages : 81

Re : Eviter les injections, mais j'ai une erreur ...

Merci Maljuna Kris, je teste touours avec des étoiles et puis de fini avec les variables, mais comme je suis tête en l'air, une piqure de rappel fait toujours du bien wink

Hors ligne

Pied de page des forums