Securisation page membre

Eléphant du PHP | 67 Messages

08 avr. 2011, 21:58

Bonsoir,

J'ai un petit problème de securité :(

En faite j'ai une page login.php :

<?php
session_start();
    if(isset($_POST['tbx_login'])==true) // On verifie que le champ a bien été posté, si oui on continue
    {
		$Login=$_POST['tbx_login']; // Recuperation du login entré dans le champ ( On le met dans une variable )
		$pass=$_POST['tbx_pass'];  // Pareil que le login
	
		if(VerifLogin($Login,$pass)==true) // On regarde dans la fonction si elle nous retourne true
		{
			$_SESSION['LoginOK']=1; // Si la fonction retourne true alors on autorise le login et on redirige sur la page membre
            header("Location:membres.php?Login=".$Login.""); 		
		}
		else
		{
			$_SESSION['LoginOK']=0; // Sinon on refuse le login.
			
		}
		
		

    }
?>
<form action="login.php" method="post">
<center><img src="images/login.png"></center>
<center><TABLE BORDER="1"><tr><th><center>Login : </center><input type="text" name="tbx_login" value="<?php if(isset($_POST["Login"])){echo $_POST['Login'];}?>" /></th></tr><br />
    <tr><th><center>Mot De Passe : </center><input type="password" name="tbx_pass" value="" /></th></tr><br />
    <tr><th><input type="submit" value="envoyer"></tr></th>
</form><center></TABLE> </center>
<?php
function VerifLogin($Login,$pass)
{
        include('config.php');
		$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
		$sql=$connexion->query("SELECT login,pwd FROM membres"); // on va chercher tous les membres de la table qu'on trie par ordre croissant
		$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
		while( $data = $sql->fetch() ) 
	
        {
           if($data->login==$Login) // On recupere le login et on le met dans la variable Login
           {
             if($data->pwd==$pass) // On recupere pwd et on le met dans la variable pass
              {
               $sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		       return true;
		      }
			  else
			  {
			   echo("Le mot de passe n'est pas correct");
			  }
		   }
		    else
		   {
		    echo("Le nom d'utilisateur n'est pas correct");
		   }
				
		}
	
		$sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		return false;
}

?>
Et une page membres.php :
<?php
include('config.php');
?>
<head>
<title>Page Membres</title>
</head> 
<?php
 //récupération de l'identifiant de la personne:
$Login  = $_GET["Login"] ;
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
$sql=$connexion->query("SELECT * FROM membres WHERE Login = '$Login' ");// on va chercher tous les membres
$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet

if( $result = $sql->fetch() ) // on récupère la liste des membres

       echo(
           "<div align=\"center\">"
           
           ." <a href=\"modifmembres.php?id=".$result->id."\">modifier</a></div>\n"
       ) ;
   
?>
    
   
   <table border="0" align="center" cellspacing="2" cellpadding="2">
   <tr align="center">
 <td>Login : </td>
<td><?php echo($result->login);?></td>
</tr>
<tr align="center">
<td>Mot De passe : </td>
<td><?php echo($result->pwd) ; ?></td>
</tr>
<tr align="center">
<td>Date D'entree : </td>
<td><?php echo($result->dateentree) ; ?></td>
</tr>
<tr align="center">
<td>Sexe : </td>
<td><?php echo($result->sexe) ; ?></td>
</tr>
<tr align="center">
<td>Ville : </td>
<td><?php echo($result->ville) ; ?></td>
</tr>
<tr align="center">
<td>Code Postal : </td>
<td><?php echo($result->codepostal) ; ?></td>
</tr>
<tr align="center">
<td>Mail : </td>
<td><?php echo($result->mail) ; ?></td>
</tr>
<tr align="center">
<td>Age : </td>
<td><?php echo($result->age) ; ?></td>
Quand je me logue tous va bien dans l'url j'ai sa :

http://localhost/espacemembres/membres. ... in=kevin42

Mais mon problème c'est que quand je tape un autre pseudo a la place de kevin42 qui est inscrit dans la base de donné il m'affiche les informations de l'autre pseudo quand j'ai rentré à la main.
Hors je voudrais afficher un message pour dire que l'accès est interdit.

Comment faire ?

Merci de votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 avr. 2011, 22:09

Il te faut stocker en session une information qui te permette d'identifier la personne qui est connectée. Tu pourras ainsi facilement vérifier s'il est autorisé ou non à consulter la page qu'il demande, en comparant par exemple le pseudo demandé à celui stocké en session :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 67 Messages

08 avr. 2011, 22:09

As-tu un exemple de code ?

Merci

Eléphant du PHP | 67 Messages

08 avr. 2011, 22:14

J'ai crée une page verif.php
<?php
session_start();

if(!isset($_SESSION['login'])) {
  echo '<center>Vous n\'êtes pas autorisé à acceder à cette zone</center>';
  include('login.php');
  exit;
}
?> 
Je l'ai inclus dans ma page membres.php et il me dit :
Vous n'êtes pas autorisé à acceder à cette zone


Merci
Notice: A session had already been started - ignoring session_start() in C:\wamp\www\espacemembres\login.php on line 3

Eléphant du PHP | 67 Messages

08 avr. 2011, 22:15

J'ai enlever le session start dans ma page login

Et il m'indique plus que sa : vous n'êtes pas autorisé à acceder à cette zone

mlerci

Eléphant du PHP | 101 Messages

09 avr. 2011, 03:14

le session start doit être envoyé avant le code html, est-ce bien le cas ?

Eléphant du PHP | 67 Messages

09 avr. 2011, 13:16

Oui c'est bien le cas.

Voici ma page membres.php :
<?php
include('config.php');
include('verif.php');
session_start();
?>
<head>
<title>Page Membres</title>
</head> 
<?php
 //récupération de l'identifiant de la personne:
$Login  = $_GET["Login"] ;
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
$sql=$connexion->query("SELECT * FROM membres WHERE Login = '$Login' ");// on va chercher tous les membres
$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet

if( $result = $sql->fetch() ) // on récupère la liste des membres

       echo(
           "<div align=\"center\">"
           
           ." <a href=\"modifmembres.php?id=".$result->id."\">modifier</a></div>\n"
       ) ;
   
?>
    
   
   <table border="0" align="center" cellspacing="2" cellpadding="2">
   <tr align="center">
 <td>Login : </td>
<td><?php echo($result->login);?></td>
</tr>
<tr align="center">
<td>Mot De passe : </td>
<td><?php echo($result->pwd) ; ?></td>
</tr>
<tr align="center">
<td>Date D'entree : </td>
<td><?php echo($result->dateentree) ; ?></td>
</tr>
<tr align="center">
<td>Sexe : </td>
<td><?php echo($result->sexe) ; ?></td>
</tr>
<tr align="center">
<td>Ville : </td>
<td><?php echo($result->ville) ; ?></td>
</tr>
<tr align="center">
<td>Code Postal : </td>
<td><?php echo($result->codepostal) ; ?></td>
</tr>
<tr align="center">
<td>Mail : </td>
<td><?php echo($result->mail) ; ?></td>
</tr>
<tr align="center">
<td>Age : </td>
<td><?php echo($result->age) ; ?></td>
Ma page login.php :
<?php
session_start();
    if(isset($_POST['tbx_login'])==true) // On verifie que le champ a bien été posté, si oui on continue
    {
		$login=$_POST['tbx_login']; // Recuperation du login entré dans le champ ( On le met dans une variable )
		$pass=$_POST['tbx_pass'];  // Pareil que le login
	
		if(VerifLogin($login,$pass)==true) // On regarde dans la fonction si elle nous retourne true
		{
			$_SESSION['LoginOK']=1; // Si la fonction retourne true alors on autorise le login et on redirige sur la page membre
            header("Location:membres.php?Login=".$login.""); 		
		}
		else
		{
			$_SESSION['LoginOK']=0; // Sinon on refuse le login.
			
		}
		
		

    }
?>
<form action="login.php" method="post">
<center><img src="images/login.png"></center>
<center><TABLE BORDER="1"><tr><th><center>Login : </center><input type="text" name="tbx_login" value="<?php if(isset($_POST["tbx_login"])){echo $_POST['tbx_login'];}?>" /></th></tr><br />
    <tr><th><center>Mot De Passe : </center><input type="password" name="tbx_pass" value="" /></th></tr><br />
    <tr><th><input type="submit" value="envoyer"></tr></th>
</form><center></TABLE> </center>
<?php
function VerifLogin($login,$pass)
{
        include('config.php');
		$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
		$sql=$connexion->query("SELECT login,pwd FROM membres"); // on va chercher tous les membres de la table qu'on trie par ordre croissant
		$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
		while( $data = $sql->fetch() ) 
	
        {
           if($data->login==$login) // On recupere le login et on le met dans la variable Login
           {
             if($data->pwd==$pass) // On recupere pwd et on le met dans la variable pass
              {
               $sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		       return true;
		      }
			  else
			  {
			   echo("Le mot de passe n'est pas correct");
			  }
		   }
		    else
		   {
		    echo("Le nom d'utilisateur n'est pas correct");
		   }
				
		}
	
		$sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		return false;
}

?>
Et le verif .php :
<?php
session_start();

if(!isset($_SESSION['login'])) {
  echo '<center>Vous n\'êtes pas autorisé à acceder à cette zone</center>';
  include('login.php');
  exit;
}
?> 

Merci de votre aide.

Eléphant du PHP | 101 Messages

09 avr. 2011, 14:00

avant le code html, cela veut dire avant la balise <html> or là, sur la page membre il est avant la balise <head> et la page login avant la balise <form>

Eléphant du PHP | 67 Messages

09 avr. 2011, 14:46

Ok ilaut juste que je mette une balise html apres la session start sur les deux pages ?
Je testerai ce soir :)

Eléphant du PHP | 67 Messages

09 avr. 2011, 16:19

Sa ne fonctionne pas :

membres.php
<?php
include('config.php');
include('verif.php');
session_start();
?>
<html>
<head>
<title>Page Membres</title>
</head> 
<?php
 //récupération de l'identifiant de la personne:
$Login  = $_GET["Login"] ;
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
$sql=$connexion->query("SELECT * FROM membres WHERE Login = '$Login' ");// on va chercher tous les membres
$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet

if( $result = $sql->fetch() ) // on récupère la liste des membres

       echo(
           "<div align=\"center\">"
           
           ." <a href=\"modifmembres.php?id=".$result->id."\">modifier</a></div>\n"
       ) ;
   
?>
    
   
   <table border="0" align="center" cellspacing="2" cellpadding="2">
   <tr align="center">
 <td>Login : </td>
<td><?php echo($result->login);?></td>
</tr>
<tr align="center">
<td>Mot De passe : </td>
<td><?php echo($result->pwd) ; ?></td>
</tr>
<tr align="center">
<td>Date D'entree : </td>
<td><?php echo($result->dateentree) ; ?></td>
</tr>
<tr align="center">
<td>Sexe : </td>
<td><?php echo($result->sexe) ; ?></td>
</tr>
<tr align="center">
<td>Ville : </td>
<td><?php echo($result->ville) ; ?></td>
</tr>
<tr align="center">
<td>Code Postal : </td>
<td><?php echo($result->codepostal) ; ?></td>
</tr>
<tr align="center">
<td>Mail : </td>
<td><?php echo($result->mail) ; ?></td>
</tr>
<tr align="center">
<td>Age : </td>
<td><?php echo($result->age) ; ?></td>
</html>
login.php :

<?php
session_start();
    if(isset($_POST['tbx_login'])==true) // On verifie que le champ a bien été posté, si oui on continue
    {
		$login=$_POST['tbx_login']; // Recuperation du login entré dans le champ ( On le met dans une variable )
		$pass=$_POST['tbx_pass'];  // Pareil que le login
	
		if(VerifLogin($login,$pass)==true) // On regarde dans la fonction si elle nous retourne true
		{
			$_SESSION['LoginOK']=1; // Si la fonction retourne true alors on autorise le login et on redirige sur la page membre
            header("Location:membres.php?Login=".$login.""); 		
		}
		else
		{
			$_SESSION['LoginOK']=0; // Sinon on refuse le login.
			
		}
		
		

    }
?>
<html>
<form action="login.php" method="post">
<center><img src="images/login.png"></center>
<center><TABLE BORDER="1"><tr><th><center>Login : </center><input type="text" name="tbx_login" value="<?php if(isset($_POST["tbx_login"])){echo $_POST['tbx_login'];}?>" /></th></tr><br />
    <tr><th><center>Mot De Passe : </center><input type="password" name="tbx_pass" value="" /></th></tr><br />
    <tr><th><input type="submit" value="envoyer"></tr></th>
</form><center></TABLE> </center>
</html>
<?php
function VerifLogin($login,$pass)
{
        include('config.php');
		$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
		$sql=$connexion->query("SELECT login,pwd FROM membres"); // on va chercher tous les membres de la table qu'on trie par ordre croissant
		$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
		while( $data = $sql->fetch() ) 
	
        {
           if($data->login==$login) // On recupere le login et on le met dans la variable Login
           {
             if($data->pwd==$pass) // On recupere pwd et on le met dans la variable pass
              {
               $sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		       return true;
		      }
			  else
			  {
			   echo("Le mot de passe n'est pas correct");
			  }
		   }
		    else
		   {
		    echo("Le nom d'utilisateur n'est pas correct");
		   }
				
		}
	
		$sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		return false;
}

?>

Merci de votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2011, 16:46

salut,

ton problème est simple tu créer $_SESSION['LoginOK'] dans login.php et tu test si $_SESSION['login'] existe dans vérif.php ce qui explique le message d'erreur ....

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 67 Messages

09 avr. 2011, 16:57

Sa a fonctionné mais maitnenant j'ai beau changé le pseudo dans l'url est j'ai accès à tous les pseudos.
Je voudrais que même si on change le login dans l'url on ai pas accès à different login que celui avec lequel on c'est loggué.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2011, 17:05

mwé,

a tu compris le code que tu a fait (copier ?).

La base c'est de pouvoir différencier la personne connectée des autres, pour cela on utilise soit le pseudo (qu'en général on considère comme unique) soit la clef primaire de la table gérant les utilisateurs.
Il te faut donc
- soit ajouter une variable de session contenant le pseudo ou la clef primaire
- soit modifier le code actuel pour que la variable de session contienne pseudo ou clef primaire ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 67 Messages

09 avr. 2011, 17:38

Je suis vraiment perdu :(

Eléphant du PHP | 67 Messages

09 avr. 2011, 18:16

Jai essayé sa :

Page login :
<?php
session_start();
    if(isset($_POST['tbx_login'])==true) // On verifie que le champ a bien été posté, si oui on continue
    {
		$login=$_POST['tbx_login']; // Recuperation du login entré dans le champ ( On le met dans une variable )
		$pass=$_POST['tbx_pass'];  // Pareil que le login
	
		if(VerifLogin($login,$pass)==true) // On regarde dans la fonction si elle nous retourne true
		{
			$_SESSION['LoginOK']=$login;			// Si la fonction retourne true alors on autorise le login et on redirige sur la page membre
			header("Location:membres.php?Login=".$login.""); 		
		}
		else
		{
			$_SESSION['LoginOK']=0; // Sinon on refuse le login.
			
		}
		
		

    }
?>
<html>
<form action="login.php" method="post">
<center><img src="images/login.png"></center>
<center><TABLE BORDER="1"><tr><th><center>Login : </center><input type="text" name="tbx_login" value="<?php if(isset($_POST["tbx_login"])){echo $_POST['tbx_login'];}?>" /></th></tr><br />
    <tr><th><center>Mot De Passe : </center><input type="password" name="tbx_pass" value="" /></th></tr><br />
    <tr><th><input type="submit" value="envoyer"></tr></th>
</form><center></TABLE> </center>
</html>
<?php
function VerifLogin($login,$pass)
{
        include('config.php');
		$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
		$sql=$connexion->query("SELECT login,pwd FROM membres"); // on va chercher tous les membres de la table qu'on trie par ordre croissant
		$sql->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
		while( $data = $sql->fetch() ) 
	
        {
           if($data->login==$login) // On recupere le login et on le met dans la variable Login
           {
             if($data->pwd==$pass) // On recupere pwd et on le met dans la variable pass
              {
               $sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		       return true;
		      }
			  else
			  {
			   echo("Le mot de passe n'est pas correct");
			  }
		   }
		    else
		   {
		    echo("Le nom d'utilisateur n'est pas correct");
		   }
				
		}
	
		$sql->closeCursor(); // On libère la connexion du serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées
		return false;
}

?>
La pge membres est la même qu'avant

Le la page verif :
<?php

if(!isset($_SESSION['LoginOK'])) {
  echo '<center>Vous n\'êtes pas autorisé à acceder à cette zone</center>';
  include('login.php');
  exit;
}
?> 
Mai il me dit toujours que je n'est pas accès.