2010-11-20 11 views
0

Quelle est la meilleure façon de créer une fonction d'authentification utilisateur sécurisée? Voici le noyau d'une fonction php qui prend le nom d'utilisateur et le mot de passe et le vérifie par rapport à la base de données.Fonction d'authentification utilisateur php la plus sécurisée

Je suis particulièrement intéressé par la requête et sa valeur de retour. L'utilisation de 'else if ($ query1)' est-elle le meilleur moyen de valider et de définir la variable de session? En outre, quelle valeur est préférable de définir pour la variable de session? Une adresse email, un nom d'utilisateur, une variable bool, un index de clé primaire, etc?

$query1 = mysql_fetch_array(mysql_query("SELECT primaryKey 
              FROM loginInfo 
              WHERE email = md5('$email') 
              AND password = md5(CONCAT('$password',salt)) 
              LIMIT 1")); 
if (!$query1) 
    return false; 
else if ($query1) { 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 
else 
    return false; 

Répondre

1

MD5 a des vulnérabilités connues et n'est plus considéré comme sécurisé. Vous devriez passer à un hachage plus fort tel que SHA-2.

Aussi, $query1 peut seulement évaluer à vrai ou faux, donc la partie finale else est inutile et ne sera jamais atteint. Vos 3 branches sont équivalentes à ceci:

if (!$query1) 
    return false; 
else { // else $query1 is obviously true 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 

Il n'y a pas une telle chose comme une « meilleure valeur » pour stocker dans la session, mais la clé primaire est généralement un choix pratique, car il est garanti d'être unique et fournit également un moyen facile de rechercher les détails restants. De plus, si vous vous trouvez fréquemment en train d'afficher des informations telles que le nom de l'utilisateur, vous pouvez également stocker ces informations dans la session pour en faciliter l'accès.

1

Il y a plusieurs problèmes avec ce code:

  • vulnérabilité d'injection SQL. (Que se passe-t-il lorsqu'un utilisateur entre une adresse électronique ') OR 1=1 OR '' = ('?) Vous devriez jeter un oeil à mysql_real_escape_string, ou envisager d'utiliser des requêtes paramétrées.
  • Vous n'appelez jamais mysql_free_result sur la ressource retournée par mysql_query, ce qui provoquera des fuites de ressources sur le serveur MySQL (jusqu'à la fin du script) et peut empêcher l'exécution de requêtes futures dans le même script.
  • MD5 est déprécié en raison de vulnérabilités. Envisagez d'utiliser un hachage dans la famille SHA à la place.
+0

Est-ce que sha1 est la seule fonction de hachage de la famille SHA actuellement en PHP? – Tableking

+0

Non. Voir le ['hash()'] (http://php.net/manual/fr/function.hash.php) et ['hash_algos()'] (http://us.php.net/ manual/en/function.hash-algos.php) fonctions. Si votre base de données ne prend pas en charge la même fonction de hachage que vous choisissez, vous devrez peut-être récupérer des valeurs dans le script PHP, puis exécuter une autre requête. SHA1 est en sécurité pour le moment, à mon avis. – cdhowie

0

Cela dépend de l'endroit où l'attaquant aura accès. S'il a d'une manière ou d'une autre accès à la base de données, les modifications suggérées du type de hachage sont importantes. Si ce n'est pas le cas, il est plus important de restreindre le nombre d'échecs de connexion pour éviter les attaques par force brute.

Cependant, la vulnérabilité cdhowie pointée à doit être corrigée du tout.

+0

Je devrais noter que j'ai coupé le code pour la simplicité. Je passe les variables $ email et $ password à la fonction déjà nettoyée pour les vulnérabilités d'injection. J'utilise en fait SHA1. Bien, je n'appelle pas mysql_free_result. –