Newsletter...chti prob :[

Newsletter...chti prob :[ - PHP - Programmation

Marsh Posté le 16-06-2005 à 15:52:31    

Lut all,
 
Je suis en train de faire une newsletter et j'ai un petit prob, en effet la page newsletter se charge pendant 5min pour finalement aboutir sur une page inconnu (les fameuses "impossible d'afficher la page" )
 
Si vous voyez une erreur dans le code ci dessou, je vous serez très reconnaissant :D
 

Code :
  1. <?
  2. $email=$_POST["email"];
  3. mysql_connect("localhost", "xxxxx", "xxxxxx" );
  4. mysql_select_db("xxxxxxx" );
  5. $query = "SELECT count(email) FROM newsletter WHERE email='".$email."'"; 
  6. $resultat = mysql_query($query);
  7. $num_rows = mysql_num_rows($resultat);
  8. echo mysql_error();
  9. //Pour un inscription
  10. if ($num_rows['mail'] == 0)
  11. {
  12.      if(isset($_POST["option_news"]) and $_POST["option_news"]=="inscription" )
  13.      {
  14.      mysql_query("INSERT INTO newsletter (id, email) VALUES ('', '$email');" );
  15.          Header("Location: resultatnews.php?erreur=2" );
  16.          exit;
  17.      }
  18.  else
  19.  {
  20.      Header("Location: resultatnews.php?erreur=5" );
  21.   exit;
  22.      }
  23. }
  24. else
  25. {
  26.      Header("Location: resultatnews.php?erreur=1" );
  27.  exit;
  28. }
  29. //Pour une désinscription
  30. if(isset($_POST["option_news"]) and $_POST["option_news"]=="desinscription" )
  31. {
  32.  if ($result['mail'] == 1)
  33.  {
  34.   mysql_query("DELETE FROM newsletter WHERE email='$email';" );
  35.          Header("Location: resultatnews.php?erreur=4" );
  36.          exit;
  37.  }
  38.  else
  39.  {
  40.      @Header("Location: resultatnews.php?erreur=3" );
  41.  }
  42. }
  43. mysql_close();
  44. ?>


 
Voili j'espere que vous allez pouvoir m'aider parce que je tourne en rond  :??:  
 
Rastafarie

Reply

Marsh Posté le 16-06-2005 à 15:52:31   

Reply

Marsh Posté le 16-06-2005 à 16:10:20    

Elle fcontionne l'étape d'inscription, parce qu'elle me semble conceptuellement bizarre ?

Reply

Marsh Posté le 16-06-2005 à 16:22:59    

/!\ Faille de sécurité monstre /!\

Reply

Marsh Posté le 16-06-2005 à 18:15:11    

Non elle ne marche pas. C'est justement pour ça que je poste, je ne voit pas ce qui fait que rien ne s'écrit ds la BDD, et je vois pas pourquoi la condition n'est pas vérifié !
Pourquoi dis tu qu'elle te semble bizarre ?
 
Pour ce qui est de la faille, je serait curieux de savoir laquelle quand même ! Ca m'aiderait !
 
Rastafarie

Reply

Marsh Posté le 16-06-2005 à 18:16:48    

FlorentG a écrit :

/!\ Faille de sécurité monstre /!\


 
Ou sa, dit nous tout !!! :sol:


---------------
“ Un avis d’un homme non avisé ne doit jamais être pris en compte par un homme avisé. ” Jean Plancher, en 1810, « Chez Bonaparte »
Reply

Marsh Posté le 16-06-2005 à 18:36:20    

Code :
  1. $query = "SELECT count(email) as mail FROM newsletter WHERE email='".$email."'"; 
  2. $resultat = mysql_query($query);
  3. $fetch    = mysql_fetch_assoc($resultat) or echo mysql_error();
  4. //Pour un inscription
  5. if ($fetch['mail'] == 0)


corrigé :o


Message édité par Martius le 16-06-2005 à 19:03:36

---------------
Martin
Reply

Marsh Posté le 16-06-2005 à 18:38:08    

Dans le champs email, essaye de mettre :

' OR true OR '


Ou un truc dans le genre :D

Reply

Marsh Posté le 16-06-2005 à 18:44:34    

Rastafarie a écrit :

Non elle ne marche pas. C'est justement pour ça que je poste, je ne voit pas ce qui fait que rien ne s'écrit ds la BDD, et je vois pas pourquoi la condition n'est pas vérifié !
Pourquoi dis tu qu'elle te semble bizarre ?
 
Pour ce qui est de la faille, je serait curieux de savoir laquelle quand même ! Ca m'aiderait !
 
Rastafarie


 
Un count renvoit toujours un résultat, même si la condition que tu précises dans le where n'est jamais satisfaite. Du coup, ton test $num_rows['mail'] == 0 n'est jamais vrai :)
 
Donc, soit tu n'utilises pas count et tu vérifies le nombre de données renvoyées soit tu utilises count et tu vérifies la valeur  renvoyée (un peu comme ce que propose MarTiuS, sans l'erreur de variable :D)

Reply

Marsh Posté le 16-06-2005 à 18:45:11    

ah ok :)
 
bah moi je fais pareil mais je protége va varible email quand meme :)
 

Code :
  1. <?php
  2. $email=htmlentities(htmlspecialchars(trim(strtolower($_POST['email']))), ENT_QUOTES);
  3. ?>


 
C'est asser je pense non ?


---------------
“ Un avis d’un homme non avisé ne doit jamais être pris en compte par un homme avisé. ” Jean Plancher, en 1810, « Chez Bonaparte »
Reply

Marsh Posté le 16-06-2005 à 19:04:25    

naceroth a écrit :

Un count renvoit toujours un résultat, même si la condition que tu précises dans le where n'est jamais satisfaite. Du coup, ton test $num_rows['mail'] == 0 n'est jamais vrai :)
 
Donc, soit tu n'utilises pas count et tu vérifies le nombre de données renvoyées soit tu utilises count et tu vérifies la valeur  renvoyée (un peu comme ce que propose MarTiuS, sans l'erreur de variable :D)


c'est bon, corrigé.
Vaut mieux utiliser count, c'est plus rapide normalement (surout si on a beaucoup d'entrées).
 

FlorentG a écrit :

Dans le champs email, essaye de mettre :

' OR true OR '


Ou un truc dans le genre :D


ça va juste casser la vérification, je vois pas de vrai risque de sécurité...
 
Pour protéger, c'est plus correct de faire un test avec une regex :

Code :
  1. if(!ereg('^[^\W]+@[^\W]+\.[a-z]{2,}$',$_POST['email']))
  2.      die('Cette adresse e-mail n'est pas valide');


Message édité par Martius le 16-06-2005 à 19:08:13

---------------
Martin
Reply

Marsh Posté le 16-06-2005 à 19:04:25   

Reply

Marsh Posté le 17-06-2005 à 11:29:19    

Orission a écrit :

ah ok :)
 
bah moi je fais pareil mais je protége va varible email quand meme :)
 

Code :
  1. <?php
  2. $email=htmlentities(htmlspecialchars(trim(strtolower($_POST['email']))), ENT_QUOTES);
  3. ?>


 
C'est asser je pense non ?


C'est pas htmlentities qu'il faut utiliser, mais addslashes. Et pour une base mysql, c'est mysql_real_escape_string :)

Martius a écrit :

ça va juste casser la vérification, je vois pas de vrai risque de sécurité...


si on se démerde bien, y'a moyen de virer toute la liste des emails, non ?

Reply

Marsh Posté le 17-06-2005 à 13:25:36    

Bon alors pour la sécurité, j'ai choisi de mettre les regex, comme ça ça vérifie par la même occasion si l'email est valide : Merci MarTiuS ;)
Mais bon apparement j'ai encore un problème : je ne suis jamais redirigé ! La page 'newsletter.php' charge pendant longtemps (en fait ça s'arrete pas :()
 
Par contre si je met un email valide, la bdd se remplie (c'est pas mal :p)
 
Donc ma question est la suivante, pourquoi ne suis-je pas redirigé ?
 

Code :
  1. //Pour un inscription
  2. if(!ereg('^[^\W]+@[^\W]+\.[a-z]{2,}$',$_POST['email']))
  3. {
  4. Header("Location: resultatnews.php?erreur=3" );
  5. }
  6. else
  7. {
  8.      if ($fetch['email'] == 0)
  9.      {
  10.          if(isset($_POST["option_news"]) and $_POST["option_news"]=="inscription" )
  11.          {
  12.          mysql_query("INSERT INTO newsletter (id, email) VALUES ('', '$email');" );
  13.              Header("Location: resultatnews.php?erreur=2" );
  14.              exit;
  15.          }
  16.      else
  17.      {
  18.          Header("Location: resultatnews.php?erreur=5" );
  19.       exit;
  20.          }
  21.      }
  22.      else
  23.      {
  24.          Header("Location: resultatnews.php?erreur=1" );
  25.      exit;
  26.      }
  27. }

Reply

Marsh Posté le 17-06-2005 à 14:18:06    

T'est sûr pour tes header, là ? Déjà ça s'écrit pas avec un H majuscule, ensuite faut jamais mettre juste la page, faut mettre toute l'url. Et vire les double-quotes inutiles :

header('Location: http://the.site.fr/resultatnews.php?erreur=1');


Message édité par FlorentG le 17-06-2005 à 14:18:18
Reply

Marsh Posté le 17-06-2005 à 14:34:44    

J'ai changé tout les 'headers' en ça :

Code :
  1. header('Location: http://securitycom.free.fr/newslet [...] rreur=X');


 
Et le problème persiste : la page charge infiniment pour ne jamais être redirigé !
Ne serais ce pas un problème dans le -exit;- ?
 
Rastafarie

Reply

Marsh Posté le 17-06-2005 à 14:35:57    

Non, ce n'est pas un problème. On a même vu des gens conseiller l'exit après un header... Met une fois des echo partout pour voir à quel moment il s'arrête...

Reply

Marsh Posté le 17-06-2005 à 14:40:16    

Comment ca ?

Reply

Marsh Posté le 17-06-2005 à 14:43:07    

Après chaque ligne, tu fait un echo genre :

echo '1';
$email=$_POST["email"];
echo '2';  
mysql_connect("localhost", "xxxxx", "xxxxxx" );  
echo '3';
mysql_select_db("xxxxxxx" );  
echo '4';
$query = "SELECT count(email) FROM newsletter WHERE email='".$email."'";    
echo '5';


Et tu note à quel numéro il plante :D Ca porte un nom ce genre de pratique : ghetto-style debugging

Reply

Marsh Posté le 17-06-2005 à 14:44:30    

FlorentG a écrit :

Après chaque ligne, tu fait un echo genre :

echo '1';
$email=$_POST["email"];
echo '2';  
mysql_connect("localhost", "xxxxx", "xxxxxx" );  
echo '3';
mysql_select_db("xxxxxxx" );  
echo '4';
$query = "SELECT count(email) FROM newsletter WHERE email='".$email."'";    
echo '5';


Et tu note à quel numéro il plante :D Ca porte un nom ce genre de pratique : ghetto-style debugging


 
 :D  :D 'est du travail de gouniafier ça, mais c'est très pratique  :whistle:  :D  
 

Reply

Marsh Posté le 17-06-2005 à 14:49:18    

FlorentG a écrit :

si on se démerde bien, y'a moyen de virer toute la liste des emails, non ?


Injection mySQL :/
J'au du mal à les voir ces failles :(


---------------
Martin
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed