Bonsoir,

J'ai un problème avec ma page de connexion, je n'arrive pas à me connecter à mon espace membre et je ne trouve vraiment pas le problème alors je viens soliciter votre aide sur ce forum, voici le code :

<?php 
$pageTitle = 'Connexion';
include('header.php'); 
include('inc/config.php');
include('inc/fonctions.php');
session_start();
    $systeme = mysql_query('SELECT install FROM sys');
    $install = mysql_fetch_array($systeme);
    if (!empty($_SESSION['login']))
    {
        mysql_query('UPDATE membre SET ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' WHERE login="' . $_SESSION['login'] . '"');
        if(!empty($_GET['deco']))
        {    
            session_unset();
            session_destroy();
            header('Location: index.php');     
        }
    }
else
    {
        if (empty($_SESSION['login']) && isset($_POST['connexion']))
        {
            if (!empty($_POST['login']) && !empty($_POST['pass']))
            {
                $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"';
                $req = mysql_query($sql) or die('Erreur MySQL !<br />'.$sql.'<br />'.mysql_error());
                $data = mysql_fetch_array($req);
                mysql_free_result($req);
                mysql_close();
                $smdp = mysql_query('SELECT * FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'"');
                $pass = mysql_fetch_array($smdp);
                $salt = "48@!alsd";
                $password_crypte = sha1(sha1($_POST['pass']).$salt);
                if($password_crypte == $pass['pass_md5']) {
                if($data)
                {
                    //On enregistre son pseudo dans la session username et son identifiant dans la session userid
                    $_SESSION['login'] = $_POST['login'];
                    $_SESSION['userid'] = $data['id'];
                    header('Location: index.php');
                }
                }
                else
                    $erreur = '<center><span class="red"><b>Identifiant inconnu!</b></span></center>';
          }
          else
            $erreur = '<center><span class="red"><b>Un champ est vide!</b></span></center>';
        }
        if($install['install'] == 1)
            echo'Erreur';
        else
        {
 if(isset($erreur)) {
echo'<div class="alerts">
	 <div class="alert-message error"><a class="close" href="connexion.php">x</a><strong>'.$erreur.'</strong></div>
	  </div>';
	  } ?>
<div class="page"><div class="superlogin">  
<div id="wrapper">
    <div class="boutonco">CONNEXION</div>  
		<div class="form">
            <form action="#" method="post">
			<input name="login" type="text" placeholder="Pseudo" value="<?php if (isset($_POST['login'])) echo stripslashes(htmlentities(trim($_POST['login']))); ?>"><br />
			<input name="pass" type="password" placeholder="Mot de passe" value="<?php if (isset($_POST['pass'])) echo stripslashes(htmlentities(trim($_POST['pass']))); ?>">
			<div class="button submit">
				<input type="image" src="img/valid.png" name="connexion" value="Connexion"><br />
			</div>
                </form>
		</div>
	</div>
  </div> 
</div>
<?php 
    }
  }
include('footer.php'); ?>


Merci d'avance de votre aide, Ben
Pour connecter quelqu'un (avec authentification), le principe est simple :

-> tu charges de la base de données les informations de connexion de la personne à partir de son login
-> tu testes si y a quelqu'un avec ce login (num_rows)
-> tu prends le mots de passe envoyé par la personne, tu le sales, tu le cryptes, de la même manière que tu le fais lorsque tu l'enregistres
-> tu testes si le mot de passe envoyé puis crypté est identique au mot de passe crypté de ta base de données
-> tu mets à jour les données de connexion.

Dans ton code, je vois en soucis :

-> un select avec en where le mot de passe crypté par md5 qui ne sert à rien (à aucun moment tu n'utilise la requête), ainsi que les quelques lignes qui suivent
 $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"';


-> une fermeture de base de données AVANT un select : mysql_close();

-> une absence de vérification qu'il y a bien une entrée dans la table avec ce login (enfin si, en utilisant la première requête alors que tu pourrais utiliser la seconde et qui se fait après la vérification du mot de passe alors qu'elle devrait se faire avant)

-> un 2ème type de cryptage (est-ce celui-là ou le simple md5 + mysql_escape_string ?)
$password_crypte = sha1(sha1($_POST['pass']).$salt);


-> l'utilisation de l'extension mysql qui est désuette depuis PHP5 et obsolète depuis PHP5.5 (petit tutoriel en Français made-in-moi pour passer de mysql_ à mysqli_ facilement)
Modifié par Lothindil (14 Jun 2014 - 22:06)