Création de forum : problème avec l'inscription

Création de forum : problème avec l'inscription - PHP - Programmation

Marsh Posté le 03-05-2007 à 02:36:00    

Bonsoir,

 

je suis en train de réaliser un forum, j'ai actuellement un problème avec la page d'inscription. En effet, après des vérifications du pseudo et de l'e-mail, après avoir protégé les données, après avoir généré le mot de passe aléatoirement, j'insère dans la base de donnée, je créé les variable de session et j'ai un message selon si cela a marché ou pas. Seul problème, au moment de valider, la seule chose que j'ai, c'est une page "blanche"

 

Voici mon code (du moins une partie) :

 
Code :
  1. //  Pour gérer le cas ?valid=inscription
  2.  else if ($confirmation == 'inscription')
  3.     {
  4.     $pseudo = $_POST['pseudo'];
  5.      $email = $_POST['email'];
  6.      $i = 0;
  7.     // Vérification de la conformité du pseudo
  8.     $nombre_pseudo = mysql_result(mysql_query("SELECT COUNT(membre_pseudo) FROM forum_membres WHERE membre_pseudo = '".mysql_real_escape_string($_POST['pseudo'])."'" )
  9.     , 0)  or die(mysql_error());
  10.     if ($nombre_pseudo != 0)
  11.      {
  12.     $erreur_pseudo1 = 'Votre pseudo est déjà utilisé par un membre';
  13.     $i++;
  14.      }
  15.     if (strlen($_POST['pseudo']) < 3 || strlen($_POST['pseudo']) > 15)
  16.      {
  17.     $erreur_pseudo2 = 'Votre pseudo fais moins de 3 ou plus de 15 caract&egrave;res';
  18.     $i++;
  19.      }
  20.   
  21.     if (!preg_match("/[^a-z0-9_ ]+/i",$pseudo))
  22.      {
  23.        $erreur_pseudo3 = 'Il y a des caract&egrave;res interdits dans ce pseudo. Seuls abcdefghijklmnopqrstuvwxyz0123456789 et _ sont auroris&eacute;s';
  24.        $i++;
  25.   }
  26.   
  27.      // Vérification de la conformité de l'e-mail
  28.     $nombre_email = mysql_result(mysql_query("SELECT COUNT(membre_email) FROM forum_membres WHERE membre_email = '".mysql_real_escape_string($_POST['email'])."'" )
  29.     , 0) or die(mysql_error());
  30.   
  31.     if ($nombre_email != 0)
  32.      {
  33.     $erreur_mail1 ='Cette adresse e-mail est d&eacute;j&agrave; utilis&eacute;e';
  34.     $i++;
  35.   }
  36.     if(!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email']) || !empty($_POST['email']))
  37.      {
  38.     $erreur_mail2 = 'Le format d\'e-mail n\'est pas correct';
  39.               $i++;
  40.   }
  41.   
  42.     if($i == 0)
  43.      {
  44.         
  45.     //On traite les données à insérer dans la BDD
  46.     $temps = time();
  47.     $pseudo = htmlspecialchars($_POST['pseudo'], ENT_QUOTES);
  48.     $email = htmlspecialchars($_POST['email'], ENT_QUOTES);
  49.    
  50.      // On s'occupe de la génération du mot de passe
  51.     $caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  52.     $caracteres_melange = str_shuffle($caracteres);  // mélange des caractères de la variable $caracteres
  53.     $motdepasse = stubstr($caracteres_melange, 0, 8); //selection de  8caractères
  54.     $mdp_crypte = md5($motdepasse); //hashage du mot de passe
  55.    
  56.     mysql_query ('INSERT INTO forum_membres(membre_pseudo, membre_mdp, membre_email, membre_inscrit, membre_derniere_visite)
  57.     VALUES ('.$pseudo.', '.$mdp_crypte.', '.$email.', '.$temps.', '.$temps.')');
  58.    
  59.     $_SESSION['pseudo'] = $pseudo;
  60.     $_SESSION['id'] = mysql_insert_id();
  61.     $SESSION['level'] = 1;
  62.    
  63.     echo'<div class="acces_ok"><img src="./template/images/accept.png"/>F&eacute;licitations' ,$_POST['pseudo'], ',
  64.     vous &ecirc;tes inscrit sur le forum.<br/> Notez ce mot de passe temporaire :' ,$motdepasse, '
  65.           <br/><a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';
  66.         
  67.             }
  68.          else
  69.      {
  70.    echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : les probl&grave;mes suivants sont survenus :<br/>' ,
  71.    $erreur_pseudo1, '<br/>' ,
  72.    $erreur_pseudo1, '<br/>' ,
  73.    $erreur_email1, '<br/>' ,
  74.    $erreur_email2, '<br/>
  75.          <a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';
  76.   }
  77.         }
  78.    else
  79.      {   
  80.    echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : vous ne devez pas arriver sur cette page
  81.          <br><a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';
  82.  }


   

 

Comment puis-je régler ce problème ? Merci d'avance ;)


Message édité par Tristou le 03-05-2007 à 14:40:21
Reply

Marsh Posté le 03-05-2007 à 02:36:00   

Reply

Marsh Posté le 03-05-2007 à 04:42:30    

Code :
  1. if (strlen($_POST['pseudo']) < 3 || strlen($_POST['pseudo']) > 15)
  2.                 {
  3.                   $erreur_pseudo2 = 'Votre pseudo est trop grand /trop petit';
  4.                   $i++;
  5.                 }
  6.              
  7.                if (!preg_match("/[^a-z0-9_ ]+/i",$pseudo))
  8.                 {
  9.                   $erreur_pseudo3 = 'Il y a des caract&egrave;res interdits dans ce pseudo';
  10.                   $i++;
  11.                 }
 

Juste un problème d'ergonomie, ces messages d'erreurs n'aident pas l'utilisateur, tu dois rappeler les conditions qui font foirer ton test.

 

Pour le reste il manque un bout.


Message édité par Shinuza le 03-05-2007 à 04:42:41

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 03-05-2007 à 10:30:12    

Je vais modifier cela ;)
 
Autrement, je n'ai mis la que la partie du script qui concerne le cas valid=inscription ;) (et il y a tout )

Reply

Marsh Posté le 03-05-2007 à 11:23:08    

Encore des SELECT * ... Pourquoi faire un SELECT * (ou SELECT COUNT(*)) qui rapatrie TOUT l'enregistrement alors que seul le pseudo est vérifié ?
 
Après on dit que php n'est pas sécurisé, mais ce sont les gens qui ne savent pas l'utiliser, en fait.
 
2èmement, il y a une magnifique injection SQL dans ta recherche des pseudos, encore une faille de sécurité.
 
Idem pour la vérif du mail.

Reply

Marsh Posté le 03-05-2007 à 13:33:40    

Je ne me suis pas prétendu expert en PHP, c'est pour cela que je viens demander de l'aide ;)
 
Pour les deux requêtes de recherche, ceci serait-il plus optimisé ?
 

Code :
  1. mysql_query("SELECT COUNT(membre_pseudo) FROM forum_membres


 

Code :
  1. mysql_query("SELECT COUNT(membre_email) FROM forum_membres


 
Ensuite, à propos de l'injection SL, où est le problème et comment le corriger ?
 
Cela peut-il aider pour le problème de départ qui est le problème d'inscription  [:toph] ?

Reply

Marsh Posté le 03-05-2007 à 13:51:03    

Si tu n'as pas les magic_quote activés c'est dangereux. Et même avec c'est peu recommandable. Imagine que comme pseudo je saisisse ' OR 1=2 -- ta requête ne renverra jamais de résultat et je pourrais donc créer des doublons à la pelle. pour éviter cela : http://fr.php.net/mysql_real_escape_string


Message édité par dwogsi le 03-05-2007 à 14:38:58

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 14:22:11    

Citation :

$motdepasse = stubstr($caracteres_melange, 0, 8); //selection de  8caractères


 
je sais pas si c'est une faute de frappe dans le code que tu as mis ici, mais ça m'a tout l'air d'une erreur! ;)


Message édité par soulmanto le 03-05-2007 à 14:22:52
Reply

Marsh Posté le 03-05-2007 à 14:37:29    

J'ai corrigé les requêtes, le substr et ajouté un mysql_real_escape_string() pour les deux requêtes de recherche mais j'ai toujours la page blanche :(


Message édité par Tristou le 03-05-2007 à 14:37:57
Reply

Marsh Posté le 03-05-2007 à 14:44:19    

C'est quoi ce stockage des erreurs?? C'est un peu moyen limite bof...
Plutôt que d'utiliser un $i et des tonnes de variables pour tes erreurs utilise plutôt quelque chose comme ça :
Ligne 6, remplacer par :
$lesErreurs = array();
 
A chaque fois que tu veux ajouter une erreur tu fais simplement :
$lesErreurs[] = "Le texte blablabla erreur dégage tu pue";
 
Et pour l'affichage, plutôt que de faire plusieurs echo tu fais un simple :
foreach($lesErreurs as $erreur) echo $erreur,'<br />';
 
A la place du test sur le $i tu fais :
if(count($lesErreurs)==0)
 
Enfin je dis ça... C'est comme tu veux mais ça me parait bien plus logique et plus clair.
 
Pour ton problème de page blanche, tu es sûr que le problème ne vient pas du code que tu ne nous montre pas?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 14:45:39    

Google-> Prepared Statements


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 03-05-2007 à 14:45:39   

Reply

Marsh Posté le 03-05-2007 à 14:48:17    

+1
mais long a expliquer/comprendre...


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 14:50:09    

dwogsi a écrit :

+1
mais long a expliquer/comprendre...


Gné?  :??:


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 03-05-2007 à 14:51:29    

Ba j'le vois bien revennir avec pas mal de questions s'il part la dessus.
Donc je proposais de simples mysql_real_escape_string(). Mais je suis tout à fait d'accord, les prepared statements c'est bien mieux.


Message édité par dwogsi le 03-05-2007 à 14:56:07

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 14:54:07    

Je prends en compte toutes les suggestions, avec un array, ça sera peut-être plus "simple", je vais voir ça ;)

 

Voilà le début de mon code( ça gère la validation de la connexion) :

 
Code :
  1. <?php
  2. session_start();
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
  6. <head>
  7.    <title>Confirmation</title>
  8.    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  9.    <link rel="stylesheet" media="screen" type="text/css" title="Design" href="./template/style.css" />
  10. </head>
  11. <body>
  12. <?php
  13.      $confirmation = $_GET['valid'];
  14.       include ('./fonctions/fonctions.php');
  15.          mysql_connect($hote, $login, $motdepasse);
  16.              mysql_select_db($base);
  17.  
  18.    // Pour gérer le cas ?valid=connexion
  19.    if($confirmation == 'connexion')
  20.      {
  21.   $pseudo = $_POST['pseudo'];
  22.   $password = $_POST['password'];
  23.  
  24.   if (empty($_POST['pseudo']) || empty($_POST['password']))
  25.         {
  26.          echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : un des deux champs n\'est pas rempli<br>
  27.         <a href="connexion.php" title="Recommencer l\'identification">Retour au formulaire de connexion</a>.</div>';
  28.         }
  29.       else
  30.         {
  31.          if(isset($_SESSION['pseudo']))
  32.     {
  33.       echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : vous ne pouvez acc&eacute;der cette page
  34.          <br><a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';
  35.     }
  36.   else
  37.     {
  38.    $pseudo = htmlspecialchars($_POST['pseudo'], ENT_QUOTES);
  39.    $motdepasse = htmlspecialchars($_POST['password'], ENT_QUOTES);
  40.    $requete_connexion = mysql_query(' SELECT membre_mdp, membre_id, membre_rang FROM forum_membres WHERE membre_pseudo = "'.mysql_real_escape_string($pseudo).'" ') or die (mysql_error());
  41.       $affichage = mysql_fetch_assoc($requete_connexion);
  42.    
  43.    if($affichage['membre_mdp'] == $password)
  44.       {
  45.        $_SESSION['pseudo'] = $pseudo;
  46.                     $_SESSION['level'] = $affichage['membre_rang'];
  47.                     $_SESSION['id'] = $affichage['membre_id'];
  48.      echo'<div class="acces_ok"><img src="./template/images/accept.png"/> Bienvenue ' ,$_SESSION['pseudo'], ',
  49.       vous &ecirc;tes maintenant connect&eacute;.<br/><a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';
  50.    }
  51.               else {
  52.                      echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : Le pseudo et/ou le mot de passe est/sont incorrect(s).<br>
  53.               <a href="connexion.php" title="Recommencer l\'identification">Retour au formulaire de connexion</a>.</div>';
  54.                    }
  55.            }  
  56.    }
  57.  }


Message édité par Tristou le 03-05-2007 à 14:58:16
Reply

Marsh Posté le 03-05-2007 à 15:00:25    

Franchement, si $_GET['valid'] a bien pour valeur inscription je vois pas trop comment tu pourrais avoir une page blanche. Tu es sûr de la valeur?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 15:11:41    

C'est à dire :??:
 
Pour le foreach, j'ai procédé comme tu m'as indiqué, j'ai une parse error
 

Code :
  1. echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : les probl&grave;mes suivants sont survenus :<br/>' ,
  2.    foreach ($erreurs as $erreur) echo $erreur, '<br/>
  3.          <a href="index.php" title="Aller à l\'index du forum">Retour &agrave; l\'index du forum</a>.</div>';


Reply

Marsh Posté le 03-05-2007 à 15:15:02    

Code :
  1. echo '<div class="erreur_forum"><img src="./template/images/cancel.png"/> Erreur : les probl&grave;mes suivants sont survenus :<br/>';
  2. foreach ($erreurs as $erreur) echo $erreur, '<br/>';
  3. echo '<a href="index.php" title="Aller à l\'index du forum">Retour à l\'index du forum</a>.</div>';



---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 15:20:47    

Ah ok, d'accord [:joce]
 
Sinon j'ai vérifié, dans la page inscription.php, j'ai bin mis confirmation.php?valid=inscription, soit la valeur du $_GET['valid']. S'il en avait été autrement, il y a le else qui affiche un message d'erreur disant que l'on ne devrait pas se trouver là.

Reply

Marsh Posté le 03-05-2007 à 15:23:15    

Oui c'est aussi ce que je me disais en fait.
Bon, par page blanche tu entends quoi? Visuellement? Si oui, y-a-t-il quelque chose dans la source de la page?
Si c'est en ligne, envois un lien.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 03-05-2007 à 15:27:54    

Bah y'a vraiment rien, juste le fond de page (qui est coloré mais OSEF :o)

 

J'ai ça dans la source

 
Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
  3. <head>
  4.    <title>Confirmation</title>
  5.    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  6.    <link rel="stylesheet" media="screen" type="text/css" title="Design" href="./template/style.css" />
  7. </head>
  8. <body>
  9. <!-- Fonctions.php
  10. Regroupe les différentes fonctions qui permetront de faire fonctionner le forum -->
 

Mes balises body et html sont bien fermées dans mon code, j'ai vérifié.

 

Par contre j'ai rien mis en ligne .

 

EDIT : et le commentaire vient du fichier où j'ai mis mes fonctions (identifiants de connexion, calcul du temps de génération de la page) qui est inclus dans ce fichier-ci


Message édité par Tristou le 03-05-2007 à 15:30:41
Reply

Marsh Posté le 04-05-2007 à 00:03:28    

Bon, on a trouvé la solution. Ca pas été simple mais on a trouvé comment corriger le problème. Si ça intéresse quelqu'un de savoir, j epeux mettre le code final  :jap:  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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