Question sécurité php

Php_Sécurité -  
Php_securite Messages postés 6 Statut Membre -
Bonjour,

Je voudrais vous soumettre mon code pour savoir si celui ci ne comporte pas de faille ?

Voici le code :

<?php 
// on teste si le visiteur a soumis le formulaire de connexion 
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') { 
 if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) { 

  $base = mysql_connect ('localhost', 'root', 'pass'); 
  mysql_select_db ('nom_base', $base); 
   

  // on teste si une entrée de la base contient ce couple login / pass 
  $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"'; 
  $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
  $data = mysql_fetch_array($req); 

  mysql_free_result($req); 
  mysql_close(); 

  // si on obtient une réponse, alors l'utilisateur est un membre 
  if ($data[0] == 1) { 
   session_start(); 
   $_SESSION['login'] = $_POST['login']; 
   header('Location: membre.php'); 
   exit(); 
  } 
  // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe 
  elseif ($data[0] == 0) { 
   $erreur = 'Compte non reconnu.'; 
  } 
  // sinon, alors la, il y a un gros problème :) 
  else { 
   $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.'; 
  } 
 } 
 else { 
  $erreur = 'Au moins un des champs est vide.'; 
 } 
} 
?>


Faut il le rendre conforme avec les nouvelles fonction PDO ?

8 réponses

  1. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Bonsoir,

    A priori tu as bien fais ce qu'il fallait niveau sécurité. Sinon je te conseil d'utiliser PDO pour te simplifier la vie, et éviter ce genre de variable : mysql_escape_string($_POST['login'])
    0
    1. Php_Sécurité
       
      Merci pour ta réponse ! je débute en php, pourrais tu me soumettre un exemple avec PDO ? car j'ai essayé avec PDO et je foire tout le code...
      0
  2. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Voila un des codes pour se connecter. Il faut que tu change les requêtes, et le mot de passe n'est pas en md5 il faut que tu le fasse.
    <?php
    session_start();
    ?>
     
    <form method="post" action="#">
    <input name="account" type="text" value="account"><br/>
    <input name="password" type="password" value="Mot de passe"><br/>
    <input type="submit" value="Valider"/><br/>
    </form>
    <?php
     
    try //test de la connexion
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
    }
    catch (Exception $e)
    {
    	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    }
    if(isset($_POST['account']) AND isset($_POST['password']))
    {
     
    	$requete = $bdd->prepare('SELECT COUNT(*) FROM membres WHERE account = ?');
        $requete->execute(array($_POST['account']));
    	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
     
    	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
        {
            echo 'Pseudo incorrect';
        }
        else
        {
    		$requete = $bdd->prepare('SELECT password FROM membres WHERE account = ?');
    		$requete->execute(array($_POST['account']));
    		$reponse = $requete->fetch();
     
            if ($_POST['password'] == $reponse['password'])
    		{
     			$_SESSION['account'] = $_POST['account'];
     
     
    			echo 'Bonne navigation<br/>';
    			echo $_POST['account'];
    		}
    		else
    		{
    			echo 'Mot de passe incorrect';
    		}
        }
     
    	$requete->closeCursor();
    }
    else
    {
    	echo 'ERREUR';
    }
    ?>
    0
    1. Php_Sécurité
       
      Merci je teste cela, je vais voir si je m'en sort ;)
      0
  3. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
     
    Si tu t'en sors pas voici la table membres
    CREATE TABLE 'membres' (
      'id' int(11) NOT NULL AUTO_INCREMENT,
      'account' varchar(50) NOT NULL,
      'password' varchar(50) NOT NULL,
      'email' varchar(100) NOT NULL,
      PRIMARY KEY ('id')
    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
    
    0
  4. Php_Sécurité
     
    Je n'arrive pas à mettre en place ce code.
    J'ai le message pseudo incorrect...

    <?php  
       
    try //test de la connexion  
    {  
     $bdd = new PDO('mysql:host=localhost;dbname=nom_bdd', 'root', 'pass', $pdo_options); //connexion  
    }  
    catch (Exception $e)  
    {  
     die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php  
    }  
    if(isset($_POST['login']) AND isset($_POST['password']))  
    {  
       
     $requete = $bdd->prepare('SELECT COUNT(*) FROM membres WHERE login = ?');  
        $requete->execute(array($_POST['login']));  
     $nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul  
       
     if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas  
        {  
            echo 'Pseudo incorrect';  
        }  
        else  
        {  
      $requete = $bdd->prepare('SELECT password FROM membres WHERE login = ?');  
      $requete->execute(array($_POST['login']));  
      $reponse = $requete->fetch();  
       
            if ($_POST['password'] == $reponse['password'])  
      {  
        $_SESSION['login'] = $_POST['login'];  
       
       
       echo 'Bonne navigation<br/>';  
       echo $_POST['login'];  
      }  
      else  
      {  
       echo 'Mot de passe incorrect';  
      }  
        }  
       
     $requete->closeCursor();  
    }  
    else  
    {  
     echo 'ERREUR';  
    }  
    ?>  
    
    <form action="index.php" method="post">  
    <p>Identifiant* <br/>  
      <input type="text" name="login"   
      value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"  /><br /></p>  
    
    <p>Mot de passe* <br/>   
      <input type="password" name="password"   
      value="<?php if (isset($_POST['password'])) echo htmlentities(trim($_POST['password'])); ?>" /><br />  
    
    <input type="submit" name="connexion" value="Connexion" /></p>  
    </form>


    Ma table membre :

    1  id  int(11)  Non  Null  AUTO_INCREMENT  
    2  login  varchar(50)  Non Null latin1_swedish_ci   
    3  password  varchar(50)  Non Null latin1_swedish_ci 


    Dans le code que j'avais poster en haut je suis redirigé vers la page membre.php

    Dans le code que tu m'as donné je ne comprend pas comment la redirection se fera ?

    Merci d'avance ;)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Php_Sécurité
     
    C'est bon tous est ok pour moi, j'avais une erreur à l'appel de ma table membre et pas membre's'.

    Par contre je n'arrive pas à rediriger vers ma page membre.php l'utilisateur une fois loggé...

    j'essaye cela mais ça ne marche pas :

    <?php
     
    try //test de la connexion
    {
        $bdd = new PDO('mysql:host=localhost;dbname=nom_bdd', 'root', 'pass'); //connexion
    }
    catch (Exception $e)
    {
    	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    }
    if(isset($_POST['login']) AND isset($_POST['password']))
    {
     
    	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE login = ?');
        $requete->execute(array($_POST['login']));
    	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
     
    	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
        {
            echo 'Pseudo incorrect';
        }
        else
        {
    		$requete = $bdd->prepare('SELECT password FROM membre WHERE login = ?');
    		$requete->execute(array($_POST['login']));
    		$reponse = $requete->fetch();
     
            if ($_POST['password'] == $reponse['password'])
    		{
    			session_start();
    			$_SESSION['login'] = $_POST['login'];
    			header('Location: membre.php');
    			exit();
    		}
    		else
    		{
    			echo 'Mot de passe incorrect';
    		}
        }
     
    	$requete->closeCursor();
    }
    else
    {
    	echo 'ERREUR';
    }
    ?>
    0
  7. Php_securite Messages postés 6 Statut Membre
     
    Up ?
    0
    1. MastercroW Messages postés 1259 Date d'inscription   Statut Membre Dernière intervention   163
       
      As tu essayés de faire une redirection en HTML ?
      0
    2. Php_securite Messages postés 6 Statut Membre
       
      Une redirection du style :
      <meta http-equiv="refresh" ;URL=ma_page_membres.php">

      ???
      0
  8. Php_securite Messages postés 6 Statut Membre
     
    <?php
     
    try //test de la connexion
    {
        $bdd = new PDO('mysql:host=...;dbname=...', '...', '...'); //connexion
    }
    catch (Exception $e)
    {
    	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
    }
    if(isset($_POST['login']) AND isset($_POST['password']))
    {
     
    	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE login = ?');
        $requete->execute(array($_POST['login']));
    	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
     
    	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
        {
            echo 'Pseudo incorrect';
        }
        else
        {
    		$requete = $bdd->prepare('SELECT password FROM membre WHERE login = ?');
    		$requete->execute(array($_POST['login']));
    		$reponse = $requete->fetch();
     
            if (md5($_POST['password']) == $reponse['password'])  
      {  
      
    			session_start();
    			$_SESSION['login'] = $_POST['login'];
    			header('Location: membre.php');
      }  
    		else
    		{
    			echo 'Mot de passe incorrect';
    		}
        }
     
    	$requete->closeCursor();
    }
    else
    {
    	echo 'ERREUR';
    }
    ?>


    J'ai un message d'erreur :

    Warning: Cannot modify header information - headers already sent by (output started at /index.php:10) in /index.php on line 66
    0