Votre avis sur ce code de restriction d'accès

Votre avis sur ce code de restriction d'accès - PHP - Programmation

Marsh Posté le 07-04-2009 à 16:09:53    

Bonjour,
 
J'aimerai avoir votre avis sur ce bout de code pour sécuriser l'accès à une section. Il fonctionne (je l'utilise) mais je me pose la question du niveau de sécurité.
 
Dans cet exemple les identifiants / mdp sont en clair dans la base SQL, un md5 suffit? Ou faut-il passer à plus costaud?
 
Donc, que pensez vous de ce code?
 
Merci
 

Code :
  1. if (isset($_POST['login']) AND  isset($_POST['pass']) AND $_POST['login']!= NULL AND $_POST['pass']!= NULL){
  2.     $_SESSION['login'] = $_POST['login'];
  3.     $_SESSION['pass'] = $_POST['pass'];
  4.  
  5. }
  6.     //on utilise enregistre les variables de la session dans d'autres variable
  7.     $login = $_SESSION['login'];
  8.     $pass= $_SESSION['pass'];
  9.  
  10.     $reponse = mysql_query("SELECT * FROM user WHERE login = '$login' " ); //requete qui va cherche l'utilisateur et le mot de passe
  11.     while ($donnees = mysql_fetch_array($reponse) )// On fait une boucle pour lister tout ce que contient la table :
  12.     {
  13.         $_SESSION['login'] = $donnees['login'];
  14.         $_SESSION['id_user'] = $donnees['id_user'];
  15.         $_SESSION['pass'] = $donnees['pass'];
  16.         $nom = $donnees['login'];
  17.         $passw = $donnees['pass'];
  18.     }
  19. if ($pass == $passw AND $passw != NULL) {
  20.     }
  21.     Else
  22.     {
  23.     header("Location: ".$url."identification.php" ); // on l'envoi se connecter sur la page qui va bien
  24.     $_SESSION['messageident'] = "Erreur d'identification, veuillez vérifier vos identifiants";
  25.     }

Reply

Marsh Posté le 07-04-2009 à 16:09:53   

Reply

Marsh Posté le 07-04-2009 à 16:42:13    

Code :
  1. /*
  2. NE JAMAIS INJECTER DIRECTEMENT LES VARIABLES RECUPEREES PAR $_POST !!!
  3.  
  4. Au minimum, echapper les données reçues avec mysql_real_escape_string()
  5. */
  6. if (isset($_POST['login']) AND  isset($_POST['pass']) AND $_POST['login']!= NULL AND $_POST['pass']!= NULL){
  7.     $_SESSION['login'] = $_POST['login'];
  8.     $_SESSION['pass'] = $_POST['pass'];
  9.  
  10. }
  11.     //on utilise enregistre les variables de la session dans d'autres variable
  12. /*
  13. Mais si $_POST['login'] n'est pas défini (ou est nul) $_SESSION['login'] n'est pas défini
  14. => risque, au moins d'erreur...
  15. Autant utiliser directement les variables de session
  16. */
  17.     $login = $_SESSION['login'];
  18.     $pass= $_SESSION['pass'];
  19. /*
  20. Eviter le SELECT *
  21. Il vaut mieux preciser les colonnes qu'on va chercher.
  22. */
  23.     $reponse = mysql_query("SELECT * FROM user WHERE login = '$login' " );
  24. //requete qui va cherche l'utilisateur et le mot de passe
  25. /*
  26. Non, elle va juste chercher l'utilisateur
  27. */
  28.     while ($donnees = mysql_fetch_array($reponse) )// On fait une boucle pour lister tout ce que contient la table :
  29.     {
  30. /*
  31. Comme quoi ce n'était pas utile de commencer par mettre $_POST[login] dans la session !
  32. */
  33.         $_SESSION['login'] = $donnees['login'];
  34.         $_SESSION['id_user'] = $donnees['id_user'];
  35.         $_SESSION['pass'] = $donnees['pass'];
  36.         $nom = $donnees['login'];
  37.         $passw = $donnees['pass'];
  38.     }
  39. /*
  40. Pourquoi tu ne mets pas directement la condition sur le password dans la clause WHERE ?
  41. Comme ça, si la requête ne renvoie rien, c'est qu'il y a un pb avec login ou pwd.
  42. Et sinon, elle renvoie un unique enregistrement.
  43. Là, il y a un risque si plusieurs users ont le même login - ce qui ne devrait pas arriver...
  44. */
  45. if ($pass == $passw AND $passw != NULL) {
  46.     }
  47.     Else
  48.     {
  49.     header("Location: ".$url."identification.php" ); // on l'envoi se connecter sur la page qui va bien
  50.     $_SESSION['messageident'] = "Erreur d'identification, veuillez vérifier vos identifiants";
  51.     }

Pour ce qui est de la sécurisation du mot de passe, un md5 peut suffire (ça dépend aussi du type de site)...
Un petit "truc" pour sécuriser encore un peu le md5 : la méthode du grain de sel.
Il s'agit d'utiliser un "mot" que tu vas ajouter (d'une manière ou d'une autre) aux données à chiffrer.
Dans le cas d'un MD5, tu peux - par exemple - faire

Code :
  1. $salt = "un mot quelconque assez long. On s en fout c est juste pour rendre le cassage du md5 plus complique.";
  2. $pass_chiffre = md5($pass.$salt);


Tu stocke ça dans ta table.
Ensuite tu prends le mot de passe saisi par l'utlisateur, tu le "chiffre" de la même manière et tu compares avec ce qui est en base.

Reply

Marsh Posté le 07-04-2009 à 16:57:22    

Merci pour cette réponse complète  :jap:  
 
Je vais suivre tes conseils pour améliorer le code.
 
Par contre la redirection par le "header" n'est pas risquée, on est d'accord?

Reply

Marsh Posté le 07-04-2009 à 17:18:49    

tu la fais suivre d'exit :

Code :
  1. header('location: adresse.php');
  2. exit();


Autre chose : la boucle while est inutile, tu peux faire cette requête :

Code :
  1. SELECT * FROM TABLE WHERE login = '$login' AND password = '$password'

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed