personnaliser la page d'accueil avec validation zone membre?

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 : personnaliser la page d'accueil avec validation zone membre?

me revoiloù

par coxine » 16 mars 2006, 11:49

alors, entre temps, j'ai recodé la page valid.php
<?php 
session_start(); 
$dbhost="localhost"; 
$dblogin="root"; 
$dbpassword=""; 
$dbname="xxxxxxxxx"; 

if (isset($_POST['login']) && !empty($_POST['login']) &&!empty($_POST['pass2'])) { // premier test à faire, est-ce qu'un login est passé ? si non, pas la peine de faire d'autre controle, on passe direct à la fin  
  $login=$_POST['login'];
  $pass=$_POST['pass2']; // on stocke les variables
  mysql_connect($dbhost,$dblogin,$dbpassword); 
  mysql_selectdb($dbname); 
  $result=mysql_query("SELECT nom, prenom FROM membres WHERE login = '".mysql_real_escape_string($login)."' AND pass2 = '".mysql_real_escape_string($pass)."' "); 

if ($row=mysql_fetch_array($result)) { // s'il y a un résultat, c'est que le login (ou le couple login/pass) existe en base. L'utilisateur s'est donc correctement authentifié 
    $_SESSION['login'] = $login; // on met les infos en session 
    $_SESSION['nom'] = $row['nom'];
    $_SESSION['prenom'] = $row['prenom'];
    header('Location: ../index.php'); // et on le redirige directement vers la page sur laquelle il a le droit d'aller 
    exit(); // bon maintenant qu'il est parti, pas la peine d'aller plus loin  
  }     
} 

// si l'authentification n'a pas fonctionné (soit pace que $_POST['login'] est vide, soit parce qu'il n'y a pas eu de résultat en base) on arrive ici et on redirige l'utilisateur sur la page d'index avec la variable erreur égale à 1 pour faire afficher le message d'erreur 
header("Location:../index.php?erreur=1"); 
?> 
apparement les test avec mon login et un mauvais mot de passe, lors d'une seconde authetification fonctionnent....j'ai un message d'erreur : utilisateur inconnu, veuillez recommencer SVP.
Je précise que cela ne fonctionne pas si je code la vérif mot de passe comme celle-ci :
 $result=mysql_query("SELECT nom, prenom FROM membres WHERE login = '".mysql_real_escape_string($login)."' AND pass2 = '".md5($pass)."' "); 
Donc, c'est bon ? Je peux y aller comme ça ? c'est suffisament sécurisé ?
Merci !

ouhouhou ?!

par coxine » 16 mars 2006, 11:20

Me revoilou...enfin...je suis perplexe sur mon truc en fait.
Les tests s'effectuent bien. Mais y a qqchose qui me dérange et j'aimerais savoir d'où ça vient.
Je m'explique : la première fois que l'on s'identifie, si login correct mais mot de passe incorrect, on a bien l'affichage de l'erreur : "utilisateur inconnu".
Ensuite, si je m'identifie avec le bon login et le bon mot de passe, j'ai mon message d'accueil "bienvenue trucmuche" qui s'affiche.
Jusque là tout va bien....
Mais si je me déconnecte.
Et que je retente une identification, je me suis aperçue que je peux mettre n'importe quel mot de passe :shock: avec mon login et l'on me dit : Bienvenue trucmuche".
Y a un big blème je pense.
Ca veut dire que lorsque je clique sur déconnecter, les variables de sessions ne sont pas vidées ? Car j'avais gardé sur ma page index "session_start();.
Je remets le code de mes pages :
index.php
<?php require_once('includes/xxxxx.php'); ?>
<?php session_start();?>
.../...
<?php
// tester la présence de la variable 'login' dans la session
if (isset($_SESSION['login']) && !empty($_SESSION['login'])) { 
  echo 'Bienvenue ' . $_SESSION['prenom'] .' '. $_SESSION['nom']; 
  // lecture de la variable de session 'login'
  echo '<br /><br />';
  echo '>> <a href="moncompte.php">Mon compte</a><br /><br />';
  echo '>> <a href="includes/deconnect.php">Déconnexion</a>';
} else {
?> 
.../...
//Le formulaire
<form action="includes/valid.php" method="post" name="form" id="form" onSubmit="showsubmit(this)">
 <input type="hidden" name="redir" value="index.php">
   <div class="hidden" id="login">
     <table width="100%" border="0" cellpadding="2" cellspacing="0">
      <tr>
        <td width="116" height="19" valign="top" class="Style4">
          <div align="right">Login</div>
        </td>
        <td width="77" valign="top">
           <input name="login" type="text" class="form" id="login" size="15">
        </td>
       </tr>
       <tr>
         <td height="19" valign="top" class="Style4">
           <div align="right">Mot de<br/> passe</div>
         </td>
         <td valign="top">
           <input name="pass2" type="password" class="form" id="pass2" value="" size="15">
         </td>
        </tr>
        <tr>
          <td height="13" colspan="2" valign="top">
            <div align="right"><a href="#" onClick="javascript:showsubmit(document.form);">Me connecter</a></div>
          </td>
        </tr>
    </table></div>
</form>
//affichage du message d'erreur
<?php
if(isSet($_GET['erreur'])) { 
   echo "<p align=right>Utilisateur inconnu,<br /> veuillez recommencer SVP</p><br>"; 
} 
?> 
La page valid.php
<?php 
session_start(); 
$dbhost="localhost"; 
$dblogin="root"; 
$dbpassword=""; 
$dbname="xxxxx"; 

if (isset($_POST['login']) && !empty($_POST['login'])) { // premier test à faire, est-ce qu'un login est passé ? si non, pas la peine de faire d'autre controle, on passe direct à la fin  
  $login=$_POST['login']; // on stocke dans $login pour simplifier l'écritude et la lisibilité 
  mysql_connect($dbhost,$dblogin,$dbpassword); 
  mysql_selectdb($dbname); 
  $result=mysql_query("SELECT id, nom, prenom, FROM membres WHERE login = '".mysql_real_escape_string($login)."' "); // je n'arrive pas avec le test sur le mot de passe y a tjs une erreur :-(

if ($row=mysql_fetch_array($result)) { // s'il y a un résultat, c'est que le login (ou le couple login/pass) existe en base. L'utilisateur s'est donc correctement authentifié 
    $_SESSION['login'] = $login; // je mets ses infos en session 
    $_SESSION['nom'] = $row['nom'];
    $_SESSION['prenom'] = $row['prenom'];
    header('Location: ../index.php'); // et on le redirige directement vers la page sur laquelle il a le droit d'aller 
    exit(); // bon maintenant qu'il est parti, pas la peine d'aller plus loin  
  }     
} 

// si l'authentification n'a pas fonctionné (soit pace que $_POST['login'] est vide, soit parce qu'il n'y a pas eu de résultat en base) on arrive ici et on redirige l'utilisateur sur la page d'index avec la variable erreur égale à 1 pour faire afficher le message d'erreur 
header("Location:../index.php?erreur=1"); 
?> 
et deconnect.php :
<?php
     session_start();
     session_destroy();     
     header('location:../index.php');
?>
Voilà, je crois que je vais tout remettre à plat. Où est-ce que ça cloche ? Je pense que je n'ai pas fait de vérif associée au mot de passe, c'est ça ?
Merci de votre aide !!! :-)

vi effectivement

par coxine » 10 mars 2006, 18:18

si j'ai 10.000 membres connectés en même temps, ça va faire travailler la bande passante :P
Mais en tous cas, merci, je note précieusement ton aide :wink: pour appliquer cette méthode plus "propre" le cas échéant.
Là, je débute encore...donc quand ça marche.......stooooooooop je ne touche plus rien.
Bon, pas encore sécurisé le mot de passe, j'y retourne :wink:

par Ryle » 10 mars 2006, 17:47

C'est pas du tout de la bidouille, cela fonctionne très bien, et c'est tout à fait envisageable de rester sur ce code là :)

Ce que je te recommandais a pour seul but de diminuer le nombre de connexion à la base de données en gardant en mémoire sur le serveur (en session donc) les informations qui pourraient t'être utile tant que ton visiteur reste sur le site :)

Typiquement (même si c'est peut être simplement fait via un cookie) sur ce forum, tu as ton pseudo indiqué tout en haut à côté du lien Déconnexion. Celui ci est très certainement mis en session (ou en cookie donc) au moment ou tu te connectes, de manière à ne pas avoir besoin sur chaque page d'aller le rechercher en base.

C'est donc juste de l'optimisation, mais il n'y a rien à redire sur ta méthode :)

youhouhou !

par coxine » 10 mars 2006, 17:27

hebe !
Ben j'ai fait complètement fausse route et mon truc fonctionne :shock:
dans valid.php j'ai effectivement précisé la requête :
 $result=mysql_query("SELECT id, prenom, nom, login, pass2 FROM membres WHERE login = '".mysql_real_escape_string($login)."' ");
Puis dans index :
Après l'ouverture de variable de session, j'ai fait une requête dans la base sur cette condition :
if (isset($_SESSION['login'])) {...//blabla alors va chercher dans la base les infos correspondant au login de la session
et après un
<?php echo $membres['prenom']; //etc
C'est de la bidouille mon truc hein :(
Je vais tester avec ce que tu viens de me donner.
Merciii

Re: hehe tu as voulu me piéger

par Ryle » 10 mars 2006, 16:38

dis moi si je fais fausse route "maitre" :lol:
Raaaaahhh ouiiiii enccoooorrree !! c'est boooonnnnn !!!! ... euh... hum... désolé :)

Tu peux en effet faire une requête pour aller chercher ses infos au moment où tu lui dis bonjour, mais le plus simple est à mon avis de mettre en session toutes les infos dont tu as besoin lors de l'authentification. Tu aurais ainsi :
 // dans la requête d'authentification tu ramènes les infos sur l'utilisateur
$result=mysql_query("SELECT nom, prenom, ... FROM membres WHERE login = '".mysql_real_escape_string($login)."' "); 

if ($row=mysql_fetch_array($result)) { 

  $_SESSION['login'] = $login; // tu colles son login en session (pour tester s'il a le droit d'accéder aux pages réservées...)
  $_SESSION['nom'] = $row['nom']; // et puis on ajoute également les infos que l'on a récupéré en base et qui pourront servir
  $_SESSION['prenom'] $row['prenom'];
  ...
  header('Location: index.php'); // redirection vers ta page accueil donc :) 
  exit();  
}     
Du coup sur ta page index.php, il te suffit de démarrer la session, tester si $_SESSION['login'] est renseigné, et à afficher ton bonjour :
<?
if (isSet($_SESSION['login']) && !empty($_SESSION['login']))
  echo 'Bienvenue '. $_SESSION['prenom'] .' '. $_SESSION['nom'];
else 
  echo 'Authentifiez vous pour un accueil personnalisé tip top';
?>

hehe tu as voulu me piéger

par coxine » 10 mars 2006, 15:19

:wink: 8)
Je crois qu'il y avait une parse error
là :
if (isSet($_POST['login']) && !empty($_POST['login']) )
il manquait le seconde parenthèse de fermeture à la fin ;-)
Merci pour les exemples d'exploitation que tu me donnes !!! top !
Mais pour l'instant, je ne cherche qu'à personnaliser l'accueil du site en fonction du login.
A ce propos, j'ai pas envie de dire : Bonjour Login.
Mais bonjour Prénom Nom en fonction du login.
Je dois donc faire une requête avant l'affichage de "bonjour login" qui va chercher dans la base les données correspondantes au login de la session. C'est bien ça ?
Je vais essayer de coder ça, dis moi si je fais fausse route "maitre" :lol:

par Ryle » 10 mars 2006, 00:23

lol, ryle docteur ès authentification, ca sonne pas mal ;)

Pour ton message d'erreur, c'est à priori parce que tu as mélangé les " (guillements / double quote) et ' (apostrophe / simple quote). Ceci devrait être mieux :
$result=mysql_query("SELECT * FROM membres WHERE login = '".mysql_real_escape_string($_POST['login'])."' AND pass = '".md5($_POST['pass'])."'"); 
Mais tu l'as bien fait ensuite :)

Pour tes fichiers, voici ce que je te propose :

index.php
<?php 
require_once('includes/xxxxxxx.php'); 
// j'ai supprimé toute la partie session, tu n'en auras pas besoin sur cette page :)
?> 

<body> 
<? 
if(isSet($_GET['erreur'])) // affichage du message d'erreur si on récupère une valeur dans $_GET['erreur'] (voir plus loin ;))
   echo "Désolé, mais cet utilisateur est inconnu<br>"; 
?> 
<form action="valid.php" method="post" name="form" id="form" onsubmit="showsubmit(this)"> 
   <div class="hidden" id="login"> 
     <div align="right">identifiant</div><input name="login" type="text" class="form" id="login" size="15"> 
     <div align="right">mot de passe</div><input name="password" type="password" class="form" id="pass2" value="" size="15> 
     <div align="right"><a href="#" onclick="javascript:showsubmit(document.form);">me connecter</a></div> 
   </div> 
<form> 
    <div align="right"><a href="inscription.php"><strong>M'inscrire >> </strong></a></div> 
valid.php
<?php 
session_start(); 
$dbhost="localhost"; 
$dblogin="root"; 
$dbpassword=""; 
$dbname="xxxxxxxxxx"; 

if (isSet($_POST['login']) && !empty($_POST['login']) { // premier test à faire, est-ce qu'un login est passé ? si non, pas la peine de faire d'autre controle, on passe direct à la fin :)
  $login=$_POST['login']; // on stock dans $login pour simplifier l'écritude et la lisibilité
  mysql_connect($dbhost,$dblogin,$dbpassword);
  mysql_selectdb($dbname); 
  $result=mysql_query("SELECT * FROM membres WHERE login = '".mysql_real_escape_string($login)."' "); // a compléter avec le test sur le mot de passe :)
  // tant que possible, essaye de lister les champs au lieu de mettre * dans le select, c'est une bonne habitude à prendre :)

  if ($row=mysql_fetch_array($result)) { // s'il y a un résultat, c'est que le login (ou le couple login/pass) existe en base. L'utilisateur s'est donc correctement authentifié
    $_SESSION['login'] = $login; // tu peux mettre ses infos en session 
    header('Location: pageDesAbonnes.php'); // et on le redirige directement vers la page sur laquelle il a le droit d'aller
    exit(); // bon maintenant qu'il est parti, pas la peine d'aller plus loin ;)
  }    
} 

// si l'authentification n'a pas fonctionné (soit pace que $_POST['login'] est vide, soit parce qu'il n'y a pas eu de résultat en base) on arrive ici et on redirige l'utilisateur sur la page d'index avec la variable erreur égale à 1 pour faire afficher le message d'erreur
header("Location:index.php?erreur=1"); 
?> 
et pis pour le fun, pageDesAbonnes.php
<?
session_start();
if (isSet($_SESSION['login']) && !empty($_SESSION['login']) {
  echo "Bienvenue sur cet espace sécurisé, le commandant et son équipage vous souhaite un bon séjour sur nos pages..."); 
  // ouais, enfin là tu mets ce que tu veux, ca ne sera accessible qu'aux personnes authentifiées ;)
}
else {
  echo "Mouah ah ah !! tu croyais pouvoir accéder à cette page sans t'être authentifié ?!"; 
  // bon pis là aussi, tu peux faire un header vers la page de login, ou vers une page acces interdit ... bref ce que tu veux :)
}
?>

alors....

par coxine » 09 mars 2006, 18:46

pour la page vérif, j'ai codé ça:
<?php
session_start();
 $dbhost="localhost";
 $dblogin="root";
 $dbpassword="";
 $dbname="xxxxxxxxxx";
 $login=$_POST['login'];

 mysql_connect($dbhost,$dblogin,$dbpassword);mysql_selectdb($dbname);
 $result=mysql_query("SELECT * FROM membres WHERE login = '".mysql_real_escape_string($_POST['login'])."' ");
 if ($row=mysql_fetch_array($result)) { 
 if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = $_POST['login']; //on recupere les données du formulaire
$_SESSION['login'] = $login;
}   
 header('Location: index.php');
  } else {
   header("Location:index.php?erreur=1"); ;
 }
 mysql_close();
?>
Comment faire en sorte de protéger le mot de passe ? est-ce suffisant si je protege juste le login ? qu'en pensez-vous ?

merchiiii bcp ryle !

par coxine » 09 mars 2006, 17:47

je vois d'ailleurs sur d'autres posts, que tu es le pro des sessions et formulaires :wink:
Je te recopie mon code, pour que tu me dises (si ça te dérange pas) que c ok.

Par contre, je n'arrive pas à "sécuriser" :? tu peux me donner un coup de main ? :oops:
J'ai ce message d'erreur :
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in d:\programmes\easyphp1-8\www\xxxxx\valid.php on line 10
ligne 10 :
$result=mysql_query("SELECT * FROM membres WHERE login = '.mysql_real_escape_string($_POST['login']).' AND pass = '.md5($_POST['pass']).'");
Mes fichiers revisités avant l'essai de sécurisation :
<?php require_once('includes/xxxxxxx.php'); ?>
<?
// initialisation
session_start() ;
if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = $_POST['login']; //on recupere les données du formulaire
$_SESSION['login'] = $login;
}
?>
<body>
<form action="valid.php" method="post" name="form" id="form" onsubmit="showsubmit(this)"> 
   <div class="hidden" id="login"> 
     <div align="right">identifiant</div><input name="login" type="text" class="form" id="login" size="15"> 
     <div align="right">mot de passe</div><input name="password" type="password" class="form" id="pass2" value="" size="15> 
     <div align="right"><a href="#" onclick="javascript:showsubmit(document.form);">me connecter</a></div> 
   </div> 
<form> 
    <div align="right"><a href="inscription.php"><strong>M'inscrire >> </strong></a></div> 
Valid.php
<?php
session_start();
 $dbhost="localhost";
 $dblogin="root";
 $dbpassword="";
 $dbname="xxxxxxx";
 $login=$_POST['login'];

 mysql_connect($dbhost,$dblogin,$dbpassword);mysql_selectdb($dbname);
 $result=mysql_query("SELECT * FROM membres WHERE login='$login'");

 if ($row=mysql_fetch_array($result)) { 
 if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = $_POST['login']; //on recupere les données du formulaire
$_SESSION['login'] = $login;
}   
 header('Location: index.php');
  } else {
   header("Location:index.php?erreur=1"); ;
 }
 mysql_close();
?>

par Ryle » 09 mars 2006, 16:18

Je pense que ton soucis provient de l'absence du session_start() dans valid.php. Du coup quand tu ajoutes login dans $_SESSION, cela m'étonnerai qu'il le mette réellement en session :)

D'un point de vue sécurité, c'est hum.. comment dire.. pas du tout sécurisé ;) En effet, quel que soit le login saisi, la première chose que tu fais c'est de le mettre en session (même si celui-ci n'existe pas). Hors comme ensuite ton test consiste à vérifier s'il y a un login en session, il sera toujours vrai :)
Cette étape ne devrait se faire qu'une fois la personne totalement identifié, donc juste avant le header :)

Pour le message d'erreur, tu peux le faire sur la page de login. Il faut pour cela enlever les echo de ta page valid.php et les remplacer par un
header("Location:index.php?erreur=true"); // ou toute autre variable pour signaler l'erreur :)
// pas de mise en session par contre hein ?! ;)
Cela va donc renvoyer l'utilisateur sur la page d'index, et tu pourrais tester si $_GET['erreur'] est présent, tu affiches le message d'erreur juste avant ton formulaire :
<?
if(isSet($_GET['erreur'])) {
   echo "Désolé, mais cet utilisateur est inconnu<br>"; 
}
?>
<form ...>

personnaliser la page d'accueil avec validation zone membre?

par coxine » 09 mars 2006, 15:40

encore moi avec mes questions !
:oops: Je remets un post, car le titre du précédent post n'a rien à voir avec la question que je voudrais vous poser.

:) J'ai un peu planché (hehe) depuis hier, et voici le fruit de mes recherches :
Le formulaire d'inscription avec ajout de données dans la base ->OK
L'espace login+mot de passe qui va vérifier dans la base si l'utilisateur est enregistré -> OK
Mon souci, est qu'une fois connecté, je n'arrive pas à afficher "bonjour...trucmuche" etc.
D'autre part, je me demande si j'ai bien sécurisé l'envoi des variables par le formulaire, j'ai lu ds qques tutos qu'il faut rajouter
mysql_real_escape_string
.
D'autre part, depuis ma page "valid", le message d'erreur s'affiche sur cette page, comment faire pour qu'il s'affiche sous le formulaire par exemple ? Faut-il que je mette un champ caché "redir" par exemple, et qu'on y fasse appel ?
Je vous mets un bout de mon code de la page index.php où se trouve le formulaire d'identification :
<?php require_once('includes/xxxxx.php'); ?>
<?
// initialisation
session_start() ;
if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = $_POST['login']; //on recupere les données du formulaire
$_SESSION['login'] = $login;
}
?>
...
<body>
<?php
// tester la présence de la variable 'login' dans la session
if ( isset( $_SESSION['login'] ) ) {
  echo 'Bonjour ' ; // lecture de la variable de session 'login'
  echo $_SESSION['login'] ;
  echo '<br /><br />';
  echo '<a href="deconnect.php">Déconnexion</a>';
} else {
?>
<form action="valid.php" method="post" name="form" id="form" onsubmit="showsubmit(this)"> 
   <div class="hidden" id="login"> 
     <div align="right">identifiant</div><input name="login" type="text" class="form" id="login" size="15"> 
     <div align="right">mot de passe</div><input name="password" type="password" class="form" id="pass2" value="" size="15> 
     <div align="right"><a href="#" onclick="javascript:showsubmit(document.form);">me connecter</a></div> 
   </div> 
</form> 
    <div align="right"><a href="inscription.php"><strong>M'inscrire >> </strong></a></div>
<?php 
} 
?>
Et le fichier valid.php
<?php
  $dbhost="localhost";
 $dblogin="root";
 $dbpassword="";
 $dbname="xxxxxxx";
 $login=$_POST['login'];

if (isset($_POST['login'])) // on verifie que la variable existe
{
$login = $_POST['login']; //on recupere les données du formulaire
$_SESSION['login'] = $login;
}
 mysql_connect($dbhost,$dblogin,$dbpassword);mysql_selectdb($dbname);
 $result=mysql_query("SELECT * FROM membres WHERE login='$login'");

 if ($row=mysql_fetch_array($result)) {    
 header('Location: index.php');
  } else {
   echo "Désolé, mais cet utilisateur est inconnu<br>";
   echo "<a href=index.php>merci de vous reconnecter</a>";
 }
 mysql_close();
?>
Voilà, si vous aviez la gentillesse de bien vouloir me sortir de là, ça cloche qqpart. :oops:
Car avant que je ne fasse les vérifications dans la base, avec une variable de session, une fois l'utilisateur enregistré, le formulaire s'effaçait pour laisser place au message "bonjour xxx"