Question sécurité php

Fermé
Php_Sécurité - Modifié par Php_Sécurité le 22/02/2012 à 18:25
Php_securite Messages postés 6 Date d'inscription mercredi 29 février 2012 Statut Membre Dernière intervention 4 mai 2015 - 2 mars 2012 à 15:00
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

MastercroW Messages postés 1094 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
22 févr. 2012 à 18:28
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
Php_Sécurité
22 févr. 2012 à 22:02
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
MastercroW Messages postés 1094 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
22 févr. 2012 à 22:23
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
Php_Sécurité
22 févr. 2012 à 22:28
Merci je teste cela, je vais voir si je m'en sort ;)
0
MastercroW Messages postés 1094 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
22 févr. 2012 à 22:32
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Php_Sécurité
28 févr. 2012 à 16:32
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
Php_Sécurité
29 févr. 2012 à 00:13
Personne pour m'aider ?
0
Php_securite Messages postés 6 Date d'inscription mercredi 29 février 2012 Statut Membre Dernière intervention 4 mai 2015
29 févr. 2012 à 22:29
Up ?
0
MastercroW Messages postés 1094 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
2 mars 2012 à 13:01
As tu essayés de faire une redirection en HTML ?
0
Php_securite Messages postés 6 Date d'inscription mercredi 29 février 2012 Statut Membre Dernière intervention 4 mai 2015
2 mars 2012 à 14:34
Une redirection du style :
<meta http-equiv="refresh" ;URL=ma_page_membres.php">

???
0
Php_securite Messages postés 6 Date d'inscription mercredi 29 février 2012 Statut Membre Dernière intervention 4 mai 2015
2 mars 2012 à 15:00
<?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