conseils pour sécuriser un système d'authenfication

Eléphanteau du PHP | 18 Messages

01 avr. 2011, 10:08

Bonjour,

Je voudrais de vos conseils pour sécuriser une page authentification. On donne le login et mdp et selon le cas , on est redirigé ou pas.
Je ne pense pas que ce script a besoin de sécurité. Mais j'y connais un peu rien alors je voudrais bien vos conseils.
Donc ce sont deux pages toute bête. Je posterai par la suite le script qui permet l'ajout d'un utilisteur et d'un login dans la BDD, je tenterai d'abord de me débrouiller tout seul.
Mais pour simplement la phase authentification, je ne vois pas quoi sécuriser.

<form action="login2.php" method='post'>
<table align="center" border="0">
  <tr>
    <td>Login :</td>
    <td><input type="text" name="login" maxlength="250"></td>
  </tr>
  <tr>
    <td>Password</td>
    <td><input type="password"name="pass" maxlength="20"></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><input type="submit" value="log in"></td>
  </tr>
</table>
</form> 
ET
<?php
include ("../../_modele/php/main.php");

if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
  extract($_POST);
  // on recupère le password de la table qui correspond au login du visiteur
  $sql = "select password from administration where login='".$login."'";
  $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

  $data = mysql_fetch_assoc($req);


 sql_mysql_query("SELECT id FROM administration	WHERE login = '$login'");
    while ($row = mysql_fetch_object($query)) {
		$id = $row->id;
    }
	
  if($data['password'] != $pass) {
    echo '<p>Mauvais login / password. Merci de recommencer</p>';
    include('login1.php'); // On inclut le formulaire d'identification
    exit;
  }
  else {

   $_SESSION['id'] = $id;
    
    echo 'Vous etes bien logué';

    // vers la page d'accueil 
	   header("Location: ../../accueil/eap/acceuil.php");
  }   
}
else {
  echo '<p>Vous avez oublié de remplir un champ.</p>';


   include('login1.php'); // On inclut le formulaire d'identification
   exit;
}


?>

ViPHP
xTG
ViPHP | 7331 Messages

01 avr. 2011, 10:42

extract($_POST) t'enlèves pas mal de sécurité, tu risques avec ceci d'écraser des variables de tout type.
Il vaut mieux récupérer manuellement les variables quitte à écrire plus de code et surtout à les sécuriser :
$login = mysql_real_escape_string($_POST['login']);
Vu que le compte est censé être unique tu peux rajouter un LIMIT 1 à ta requête afin de limiter la recherche.

De ce fait tu n'es censé faire aucune boucle sur la récupération. Un simple mysql_fetch_assoc() précédé d'une vérification de résultat (on compte le nombre de résultat avec mysql_num_rows), car on ne peut récupérer un résultat s'il n'y en pas. ;)

Ensuite tu peux enlever ta seconde requête et l'intégrer dans la première, tu travailles sur la même table avec la même recherche.

Tes mots de passe semblent être en clair dans ta table non ?
Utilise un hash md5() avec une clé pour sécuriser les mots de passe.
$clé = "123456789%;sndf";
$pass = "mon mot de passe";
$mot_de_passe_securise = md5($clé . $pass);
On ne doit rien envoyer au navigateur avant de faire un header(), d'ailleurs il va te le dire via un beau warning.
Inverses le echo et le header().

Eléphanteau du PHP | 18 Messages

01 avr. 2011, 11:51

Merci bien, c'est changé et j'ai crypter en md5 les mot de passe directement dans la base.