Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VÉRIFICATION DE LOGIN VIA HASH MD5


Information sur la source

Catégorie :SQL Classé sous : cryptage, hash, login, md5, sha Niveau : Débutant Date de création : 11/10/2005 Date de mise à jour : 11/10/2005 23:12:46 Vu : 14 173

Note :
8 / 10 - par 3 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Bah voila, dans ma nuit, je me suis posé une question (depuis la source de Coucou d'ailleurs !) : Comment peut-on réussir à ne plus se faire chier entre les addslashes et autres ?
Et la, une idée m'est venue : l'utilisation d'un hash.
Que ce soit via MD5, SHA-1, ou un moyen de cryptage quelconque, tous les caractères de type ' \ * # risquaient fort bien de disparaitre dans le hash !
Alors, j'ai fais ce bout de code avec du hash MD5, mais il vaut mieux que vous preniez autre chose ( SHA-1 est un peu plus sécurisé du haut de ces 40 bits :p).
Voila comment j'ai fais :
 

Source

  • <?php
  • function login($login, $password) {
  • if ( strlen($login) < 4 ) return false; // Si le login est inférieur à 4 charactères, on arrète tout.
  • $password = md5($password);
  • $login = trim($login);
  • // Le plus important : la commande de query. J'utilise strtolower pour supprimer la casse.
  • $query = mysql_query("SELECT COUNT(*) FROM users WHERE MD5(login) = '".md5($login)."' AND password = '".$password."' ");
  • $data = mysql_fetch_row($query);
  • // Si il existe un enregistrement (le login étant unique pour chaque personne), alors c'est bon :)
  • return ( $data[0] == 1 ) ? true : false;
  • }
  • // Si le formulaire est soumis
  • if ( isset($_POST['submit']) ) {
  • if ( login($_POST['login'], $_POST['password'] ) { // Si la fonction ci-dessus est TRUE (vrai)
  • session_start();
  • $_SESSION['logged_in'] = true; // On met ca en session
  • header('Location: private.php');
  • die(); // Etre sûr que la fin de cette page ne sera pas pris en compte
  • } else {
  • $warning = 'Le couple login/password que vous avez entrez est incorrect'; // si la fonction renvoit false, on se fait une variable d'erreur
  • }
  • }
  • if ( isset($warning) ) { // Test de présence de la variable d'erreur
  • echo '<p>'.$warning.'</p>';
  • }
  • // Affichage du formulaire
  • ?>
  • <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  • <fieldset>
  • <legend>Login</legend>
  • <label for="login">Login :</label>
  • <input type="text" name="login" id="login"/>
  • <label for="password">Mot de passe :</label>
  • <input type="password" name="password" id="password"/>
  • <input type="submit" name="log" value="Se connecter"/>
  • </fieldset>
  • </form>
<?php
 function login($login, $password) {
  
   if ( strlen($login) < 4 ) return false; // Si le login est inférieur à 4 charactères, on arrète tout.
  
  $password = md5($password);
  $login = trim($login);

// Le plus important : la commande de query. J'utilise strtolower pour supprimer la casse.
  $query = mysql_query("SELECT COUNT(*) FROM users WHERE MD5(login) = '".md5($login)."' AND password = '".$password."' ");
  $data = mysql_fetch_row($query);
  
// Si il existe un enregistrement (le login étant unique pour chaque personne), alors c'est bon :)
  return ( $data[0] == 1 ) ? true : false;
  
 }

// Si le formulaire est soumis
 if ( isset($_POST['submit']) ) {
      if ( login($_POST['login'], $_POST['password'] ) { // Si la fonction ci-dessus est TRUE (vrai)
           session_start();
           $_SESSION['logged_in'] = true; // On met ca en session
           header('Location: private.php');
           die(); // Etre sûr que la fin de cette page ne sera pas pris en compte
      } else {
           $warning = 'Le couple login/password que vous avez entrez est incorrect'; // si la fonction renvoit false, on se fait une variable d'erreur
      }
 }

 if ( isset($warning) ) { // Test de présence de la variable d'erreur
  echo '<p>'.$warning.'</p>';
 }

// Affichage du formulaire 
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<fieldset>
 <legend>Login</legend>
 <label for="login">Login :</label>
 <input type="text" name="login" id="login"/>
 <label for="password">Mot de passe :</label>
 <input type="password" name="password" id="password"/>
 <input type="submit" name="log" value="Se connecter"/>
</fieldset>
</form>

Conclusion

Alors par contre, je n'ai pas eu le temps de le tester, car mon serveur apache connait quelque problème en local chez moi. Je poste quand même la source, si quelqu'un trouve mieux ou alors me dit que ca marche pas, au moins je serais fixé :)

voila :)

PS : J'ai peut-être fait une erreur de placement etre MD5() et LOWER() et entre md5() et strtolower(). Je sais plus dans quel ordre PHP lit =)
 

Historique

11 octobre 2005 23:04:49 :
J'ai enlevé le LOWER() et strtolower() vu que d'après Antho, les champs de types VARCHARS sont insensibles à la casse
11 octobre 2005 23:12:46 :
Je re-update vite fait, histoire de montrer un exemple.

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 11/10/2005 12:13:13 administrateur CS

Hello,

pour l'ordre, ça devrait être bon ;-)
Pour le reste aussi, c'est pas con! Le seul bémol, ça fait faire 2 hash à chaque login. Mais bon...autre bemol, je ne suis pas certain que MySql sache hasher sha1 (à vérifier). Ce qui oblige donc à garder md5.

Mais bon, bonne idée :-)

signaler à un administrateur
Commentaire de Anthomicro le 11/10/2005 19:19:48

Salut,

inutile d'utiliser LOWER et strtolower dans le login vu que les champs varchar sont insensibles à la casse (et il est préférable d'utiliser ce type de champ pour justement ne pas avoir besoin de faire appel à ces fonctions).

signaler à un administrateur
Commentaire de FhX le 11/10/2005 23:03:53

Bah je savais même pas...
Ca va m'éviter bien des soucis alors !

signaler à un administrateur
Commentaire de FhX le 12/10/2005 00:23:53

Pour répondre à Malalam... sisi, SHA-1 est bien pris en compte par MySQL :

$sql = "SELECT COUNT(*) FROM ma_base WHERE SHA1(login) = '".sha1($login)."' AND password = '".$password."' ";

Et ca marche :)

signaler à un administrateur
Commentaire de coucou747 le 12/10/2005 15:05:38

il ne manquerais pas un GROUP BY 1=1 dans ta requette ?

bon, à part ça, comme tu utilises les sessions, je ne suis pas sur qu'une fonction soit nécéssaire car si tu te débrouilles bien, tu n'appelleras cette fonction qu'une fois...

en plus, t'as pas de return... tu devrais plutot lui faire renvoyer un bool, pour savoir si on est logué, et la partie "main" elle afficherais le résultat...

signaler à un administrateur
Commentaire de Anthomicro le 12/10/2005 15:45:58

" il ne manquerais pas un GROUP BY 1=1 dans ta requette ?"

heu pourquoi il en manquerait un ?

signaler à un administrateur
Commentaire de coucou747 le 12/10/2005 15:54:29

il utilises COUNT...

signaler à un administrateur
Commentaire de Anthomicro le 12/10/2005 17:10:17

y'en a pas besoin ;-)

signaler à un administrateur
Commentaire de FhX le 12/10/2005 19:02:16

return ( $data[0] == 1 ) ? true : false;

Y'a bien un return dans la fonction :)


Au passage, si j'ai fait une fonction, c'est pour un souci de clarté =)

signaler à un administrateur
Commentaire de J_G le 17/10/2005 10:38:04

Astuces intéressantes... surtout pour le cryptage des données d'identification !  

Car, pour éviter 1 addslashes et le stripslashes qui suit, tu utilises : 2 md5(PHP) et 1 MD5(MySQL). Economie tout relative ;)

Ensuite, j'aurais qques'commentaires :
* Ca nous fait pas un "ERROR headers already sent" un truc comme ça ? (Je n'ai pas testé)
# session_start();
# ...
# header('Location: private.php');

* La COMPARAISON en MySQL est insensible à la casse SI :
"Les valeurs dans les colonnes CHAR et VARCHAR sont classées et comparées sans tenir compte de la casse, à moins que l'attribut BINARY n'ai été spécifié lors de la création de la table" (doc MySQL)

* A propos de la fonction mysql_fetch_row() :
" Retourne un tableau numérique qui correspond à la ligne récupérée, ou FALSE s'il n'y a plus de lignes." (doc PHP)
Donc je te suggère plutôt:
return is_array($data);  ou  return !($data===false)
ou l'utilisation de mysql_num_rows qui compte jestement le nombre de lignes du résultat...


Voilà, sinon c'est très bien!
A+

signaler à un administrateur
Commentaire de FhX le 17/10/2005 23:01:55

Je vais me taper la réponse :)
"Car, pour éviter 1 addslashes et le stripslashes qui suit, tu utilises : 2 md5(PHP) et 1 MD5(MySQL). Economie tout relative ;)" C'est vrai, mais en même temps je n'ai plus besoin de savoir si ma variable est passé au nettoyage ou pas (le login dans ce cas la), car à l'inscription du membre, j'aurais viré tous les caractèresqui ne m'intéresse pas. Donc, si quelqu'un tente une quelconque requête à la con lors du login, celle ci est immédiatement erradiqué à cause du hash.

"* Ca nous fait pas un "ERROR headers already sent" un truc comme ça ? (Je n'ai pas testé)" Non, je fais toujours en sorte de ne jamais avoir de sortie HTML avant mes headers :) J'en ai même fait un tuto y'a pas longtemps =) Ne compte pas sur moi pour ce genre d'erreur =)

"ou l'utilisation de mysql_num_rows qui compte jestement le nombre de lignes du résultat..."Non, je ne le fais pas, car le login DOIT et EST TOUJOURS unique. Donc de ce fait, le nombre d'enregistrement possible lors d'un SELECT sur un login doit être :
-> soit de 1 si me membre est bien inscrit.
-> soit de 0 si le login/pass ne corresponde pas.
Le nombre de ligne, dans ce cas la, ne sert strictement à rien du tout :)

Sinon, oui c'est lourd. La comparaison des hashs est beaucoup plus gourmande qu'un pauvre addslashes, mais en même temps, je me prémuni d'un gros problème de sécurité. Si un jour, quelqu'un trouve comment passer à travers d'un addslahes (on ne sait jamais !), passer au travers d'un hash est plus embetant.
Cependant, avec un hash, il y a le risque de collision, bien qu'il soit très faible.
C'est un risque parmis tant d'autres :)

signaler à un administrateur
Commentaire de Anthomicro le 17/10/2005 23:38:18

"mais en même temps, je me prémuni d'un gros problème de sécurité"

if(get_magic_quotes_gpc()===0)
{
$chaine=addslashes($chaine);
}

mysql_query('requete blabla WHERE login="'.$chaine.'" OR machin...');

ça te prémunit tout autant ^^

signaler à un administrateur
Commentaire de FhX le 18/10/2005 15:31:44

Oui, mais très personnelement, je préfère faire un mysql_escape_string() ou mysql_real_escape_string() qui est mieux approprié pour échapper des caractères qui vont dans une requète SQL.

signaler à un administrateur
Commentaire de malalam le 18/10/2005 16:10:35 administrateur CS

Je suis d'accord avec FhX (je sais, c'est inutile comme commentaire, lol, mais j'avais envie de le dire).
mysql_real_escape_string () est en remation plus étroite avec mysql. Dès fois qu'un jour les développeurs de mysql décident de changer les caractères devant être échappés, cette fonction sera mise à jour très vite. addslashes () ne le sera peut-être pas, puisque n'étant pas dédiée.

signaler à un administrateur
Commentaire de Anthomicro le 18/10/2005 17:07:31

C'est sûr, enfin perso je n'ai jamais rencontré de problèmes avec addslashes :-) (et au pire quand on fait une fonction myaddslashes on peut tout à fait mettre un mysql_[real_]escape_string() après :-)

signaler à un administrateur
Commentaire de FhX le 18/10/2005 18:13:14

Voui, mais ca t'oblige à réécrire une fonction pour en faire fonctionner 2 sur une même variable =)
Donc, est-ce que tu y gagnes vraiment ? Quelle manière est la plus rapide ?
Alors la, j'en sais rien :D

Parce que avec ma méthode :
vérification hash login sql + vérification hash login php
(je ne compte pas le mot de passe qui est lui de toute facon hashé)

La méthode d'Antho (à quelques chose près) :
vérification get_magic_quote_gpc()
utilisation d'addslashes() le cas échéant
utilisation de mysql_real_escape_string() (optionnel)
vérification login sql + vérification login php

Ce que je peux faire très simplement, on peut le faire avec un peu plus de volonté chez Antho ;)
Par contre, je connais pas au niveau temps de traitement ce que ca donne, il se peut que ma méthode soit "largement" plus longue à traiter.
A voir :)

signaler à un administrateur
Commentaire de Anthomicro le 18/10/2005 18:38:41

" Voui, mais ca t'oblige à réécrire une fonction pour en faire fonctionner 2 sur une même variable =)" ? je te suis pas là

ma méthode c'est ça :

vérification get_magic_quote_gpc()
utilisation d'addslashes() le cas échéant
vérification login sql + vérification login php

c'est tout.

signaler à un administrateur
Commentaire de doudou3158 le 28/04/2006 17:50:56

Euh juste comme ça mais il manque une parenthèse ligne 14.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Cryptage Sha [ par adeliz ] Bonjour.Voila, pour plus de sécurité (et pour ma culture perso :) ), je voudrais savoir comment crypter une phrase... Pour le moment j'arrive à le fai MD5 - Visualisation du cryptage [ par sebounet62 ] Bonjour,Je recherche à afficher la valeur d'un MD5.&lt;?php$str = 'pomme';md5($str);echo '$str'?&gt; J'ai tenté de faire ce code mais cela ne fonction Authentification par challenge MD5 [ par psyjc ] Bonjour tout le monde,j'ai code un petit script d'authentification login/pass PHP qui fonctionne sur le principe d'un challange par MD5.le code est re Base de hash MD5 [ par hazkaal ] Bonjour,Voici une base de hash MD5 que j'ai développé en PHP.On peut :    -ajouter un mot dont sa valeur md5 sera ajoutée dans un dictionnaire   -rech securite et cryptage [ par renaud288 ] Vu le nombre important de demande au sujet de la sécurité de mots de passe transmis, je vais faire un truc général.Bon nombre d'entre vous (les débuta cryptage [ par huricane ] Bonjour, J'ai un problème pour crypter de simple mot de passe dans une base de donnée. Je suis sous postgresql et je dispose d'une table utilisateur o code pour cryptage MD5 en série [ par yaca ] Bonjour, Je suis débutant essaie de comprendre ce qui se passe dans vos lignes, mais je ne sais encore écrire seul!! Je voudrais crypter MD5 en série code pour cryptage MD5 en série [ par yaca ] Bonjour, J'ai une bdd Mysql où j'ai des mots de passe en clair. J'aimerais les coder MD5 en série, mais ne connais pas la programmation. J'ai bien réu problème avec requete sql et php [ par machmacha ] bonjour,j'ai une requête simple sur php la voilà:$sql = mysql_query("SELECT *                   FROM test                   WHERE login='".$_POST['log Problème structure de contrôle [ par Allan007 ] Bonsoir à tous,je suis entrain de créer un espace membre sans l'utilisation de SQL, les informations sont répertorier dans un .txt.J'ai rencontrer un


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.