problème de redirection

Petit nouveau ! | 1 Messages

05 oct. 2014, 14:10

Bonjour,
j'ai trois types d'utilisateurs enregistrés dans ma base de données admin, utilisateur et superviseur, ils accèdent chacun à son espace propre via la même interface d'authentification
tout autre login ou mot de passe non inscrit n'a pas d'accès à l'application dont voici le code de la page login


session_start();
//require('./includes/login.php');

/*************************************/
/*Proc?dure de connexion au base
/***********************************/
$host="127.0.0.1";
$user="root";
$password="root";
$myconnex=mysql_connect($host,$user,$password) or die("connexion impossible");
////////////////////////////////// Test l'existance de la base et le nom de la base ////////////////////////
$bdd="stage";
mysql_select_db($bdd) or die ("erreur de connexion à la base de donn?es");
  
if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['mot_de_passe']) && !empty($_POST['mot_de_passe']))) { 
  extract($_POST);
  
  // on recupère le password et le login  de la table qui correspond au visiteur
  $sql = 'SELECT * FROM `admin_smtp` WHERE login="'.mysql_escape_string($_POST['login']).'" AND mot_de_passe="'.mysql_escape_string(md5($_POST['mot_de_passe'])).'"';
  $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
  $count=mysql_num_rows($result);
  $row=mysql_fetch_array($result); 
  mysql_free_result($result); 
  mysql_close();
 
  if($row['login'] != $login) {
    echo '<p>Mauvais login / password. Merci de recommencer</p>';
    include('./index.php'); // On inclut le formulaire d'identification
    exit;
  }	
  else {
  //connexion selon le type de l'utilisateur 
	  
  switch ($row['statut']) {
    case 2:
        $_SESSION['login'] = $_POST['login']; 
        header('Location:./admin/services.php'); 
	    echo ("you logged in as admin"); 	
    break;
    case 0:
		$_SESSION['login'] = $_POST['login'];            
	    header("location:./user/smtp_client.php");
        echo ("you logged in as client");
    break;
    case 1:
        $_SESSION['login'] = $_POST['login'];            
	    header("location:./sup/smtp_sup.php");
        echo ("you logged in as supervisor");
    break;
 
}
 }
  }
  else {
   echo '<p>Vous avez oublie de remplir un champ.</p>';
   include('./index.php'); // On inclut le formulaire d'identification
   exit;
  
}

?>

Mon problème est lorsque je me connecte en tant que admin c'est à dire case statut = 2
il m'affiche le message "Mauvais login/password .."

j'arrive pas à comprendre où est exactement le problème ?
Modifié en dernier par moogli le 05 oct. 2014, 20:13, modifié 1 fois.
Raison : bbcode php

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

05 oct. 2014, 20:32

salut,

merci d'utiliser les bbcode (les petits carrés / rectangles au dessus de la zone de saisie) afin de mettre en forme ton message que cela soit lisible.

pour ton code
- tu peux te passer des isset empty jouant ce role (si la variable n'existe pas = pas d'erreur et retourne true).
- extract est a proscrire (possibilités de collision / écrasement de variable, perte de l'origine des variables => foutoire). .
- on n'utilise pas le mot de passe dans la requête sql (parce que c'est une chance de plus de la passe en clair sur le réseau).
- if ($row['login'] != $login) s'il n'y a pas de résultat il y aura une erreur (undefined index) et le test va être validé. Au final c'est le but rechercher mais ce n'est pas "propre".
- $_SESSION['login'] = $_POST['login']; => autant ne l'écrire qu'une fois avant le switch
- en sql les délimiteurs de chaines de caractères c'est les apostrophes pas les guillemets :)

Donc si tu as un message c'est que tu dois vérifier effectivement user / password qui ne doivent pas correspondre ou exister dans la base de données

au final
<?php
$sql = 'SELECT mot_de_passe,status FROM admin_smtp WHERE login=\'' . mysql_escape_string($_POST['login']) . '\'';
$result = mysql_query($sql) ;
if($result === false) {
// message d'erreur pertinent et pas de die, inclus l'index et le message doit s'afficher correctement dans la mise en page. et mieux un "production" ce message ne doit pas être affiché mais seulement logé et un message bateau (genre erreur technique) doit être affiché). 
}else {
$data = mysqll_fetch_assoc($result);
if($data == null){
 echo '<p>Login existe pas merci de recommencer</p>';
        include('./index.php'); // On inclut le formulaire d'identification
        exit;
}else {
if(data['mot_de_passe'] == $_POST['mot_de_passe']) {
le switch
}else {
// mot de passe KO !
}
}
dernière chose vu ton code les mots de passes sembles stockés en clair dans la base de données c'est une mauvaise idée, il est préférable d'utiliser un hash.
la fonction password_hash peux t'aider pour cela ;).

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