Version complète: sur le forum Webmaster Hub : Vérifier la sûreté des mots de passe
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
MS-DOS_1991
Bonjour, smile.gif

Je voudrais que mes (futurs) membres s'inscrivent avec des mots de passe sûrs (durs à trouver par une recherche dans un dictionnaire par exemple)

Je voudrais donc un script (php) qui ouvre un dictionnaire (dico.txt), puis qui recherche le mot de passe dedans et retourne un message d'erreur si le mot a été trouvé...

CODE

<?php
$passe = $_POST['passe']; // Mot de passe soumis par formulaire
$dico = fopen("http://127.0.0.1/dico.txt", "r+"); // Ouverture du Dictionnaire en lecture seule
...
// Recherche de $passe dans $dico
...
fclose($dico); // Fermeture du Dictionnaire
?>

Je précise que mon dictionnaire est écrit avec 1 mot par ligne...

A mon avis, il faut faire une boucle for pour lire chaque ligne du fichier unsure.gif

Quelqu'un pourrait-il m'indiquer comment procéder ? huh.gif
-aK-
Il me semblerait plus simple et moins gourmand de mettre ton dictionnaire dans une table mysql et de faire une simple requête select pour voir si l'enregistrement existe.
Dash
la surete des mots de passe depend non seulement de la qualite des mots de passe mais egalement dans les methodes de traitement de ces mots de passe.
MD5 est un excellent choix pour une application web traditionnelle. Rapide, non-bijective (cad non-reversible).
CITATION
$hash1 = md5($mot_de_passe); // utilisation simple
$hash2 = md5(md5($mot_de_passe ) . md5($grain_de_sel)); //utilisation plus complexe


La technique du grain de sel (utilisee notamment sur les forums du Hub) est detaillee sur developpez, http://matthieu.developpez.com/authentification/
A ce propos la conclusion de l'article est on ne peut plus pertinente. "la première question à vous poser est : est-ce nécessaire ? [...] soyez assez honnête avec vous même pour apprécier à sa juste valeur votre besoin de protection, et ne pas céder à la tentation d'alourdir votre code pour le transformer en forteresse". smile.gif
MS-DOS_1991
Excusez-moi mais je ne maitrise pas parfaitement les commandes MySQL... unsure.gif comment puis-je faire une requête pour rechercher le passe dans la table ??

J'ai écrit ceci mais je ne suis pas sûr du tout du fonctionnement:

CODE

<?php
$passe = $_POST['passe']; // Mot à rechercher dans le dictionnaire
mysql_connect("localhost", "root", ""); // Connection au serveur SQL...
mysql_select_db("site_web"); // Connection à la Base MySQL
$retour_brut = mysql_query("SELECT * FROM dictionnaire WHERE mot = $passe");
$retour = mysql_fetch_array($retour_brut);
if($passe == $_retour)
{
echo 'Le mot de passe'. $passe .'a été trouvé: il n'est donc pas sûr...";
}
else
{
echo 'Le mot de passe'.$passe .'n\'a pas été trouvé, il est donc relativement sûr';
}
........
$passe_crypte = md5($passe); // Cryptage sécurisé
unset($passe); // Suppression des variables inutiles
.......
Fin de l'inscription
.......
?>

Structure de la table dictionnaire:
CODE
Champ | Type         | Attributs | Défaut | Extra          | Action |
 id   | int(11)      | Non       |        | auto_increment |        |
 mot  | varchar(255) | Non       |        |                |        |


Est-ce que vous pourriez m'aider svp ?
Dash
Pour verifier qu'un mot de passe est "relativement sur" il "suffirait" de verifier
- qu'il ne soit pas trop court (nbr de caracteres minimum) (strlen(...) > ... )
- qu'il comporte un melange de minuscules et de majuscules ( strtoupper(...) ?= strtolower(...) )
- qu'il soit constitue d'un melange de chiffres, de lettres et autres caracteres exotiques
- ...

Pas besoin de dictionnaire pour cela. Ni de SQL. smile.gif
Developer
Je vais commenter la requête SQL qui tu as fais:

- Utilise plutôt une boucle (while) pour sélectionner tout les champs.
- Attention aux '

Mon avis sur tout ça:
- Je ne vois pas pourquoi tu veux utiliser ce mode d'enregistrement de mot de passe, si tu veux plus de sécurité et donc ne pas donner aux membres la possibilité de choisir un mot de passe, utilise un simple système qui genère à chaque fois un code diffèrent du genre "998QDQT78TQDF8"..

- La 2ème solution consisterai à laisser le choix aux membres et utiliser le "md5"..



Developer.
MS-DOS_1991
CITATION(Dash)
Pour verifier qu'un mot de passe est "relativement sur" il "suffirait" de verifier
- qu'il ne soit pas trop court (nbr de caracteres minimum) (strlen(...) > ... )
- qu'il comporte un melange de minuscules et de majuscules ( strtoupper(...) ?= strtolower(...) )
- qu'il soit constitue d'un melange de chiffres, de lettres et autres caracteres exotiques

Salut Dash, ^_^

Oui, mais je veux aussi éviter que mes membres écrivent ce genre de mots de passe 9&'4(\@{-= chez eux ou sur un petit bout de papier... alors qu'il est plus simple de retenir GaBuzOMeuh laugh.gif
Developer
Pour ne pas permettre à tes membres d'utiliser les caractères tels que: 9&'4(\@{-= , tu peux utiliser les expressions régulières. C'est beaucoup plus évident que les autres méthodes.


Developer.
rottman
Voilà pour un mot de passe par ligne du fichier texte :

CODE
<?php
$nb_mots = count(file("dico.txt"));
$mot = file("dico.txt");
$mdp = $_POST["mdp"];
for($i=0;$i<$nb_mots;$i++)
 {
   if(strpos($mdp,$mot["".$i.""])=="true")
       {
        $mauvais = "true";
        }
  }
if(!$mauvais)
 {
  echo "Votre mot de passe est securisé.";
 }
elseif( $mauvais == "true")
 {
  echo "Votre mot de passe n'est pas sécurisé.";
  }
?>


De rien !!
MS-DOS_1991
CITATION(rottman @ lundi 28 mars 2005, 10h43)
Voilà pour un mot de passe par ligne du fichier texte :

CODE
<?php
$nb_mots = count(file("dico.txt"));
$mot = file("dico.txt");
$mdp = $_POST["mdp"];
for($i=0;$i<$nb_mots;$i++)
 {
   if(strpos($mdp,$mot["".$i.""])=="true")
       {
        $mauvais = "true";
        }
  }
if(!$mauvais)
 {
  echo "Votre mot de passe est securisé.";
 }
elseif( $mauvais == "true")
 {
  echo "Votre mot de passe n'est pas sécurisé.";
  }
?>


De rien !!
*


Salut rottman, smile.gif

Désolé mais ton code ne marche pas...

Voici celui que j'ai adapté: hypocrite.gif

CODE
<?php
$nb_mots = count(file("dictionnaire_fr_1.txt"));
$mot = file("dictionnaire_fr_1.txt");
$passe = $_POST["passe"];
for($i=0;$i<$nb_mots;$i++)
 {
   if(strpos($passe,$mot["".$i.""])=="true")
       {
        @$mauvais = "true";
       }
 }
if(!@$mauvais)
 {
  echo "Votre mot de passe ($passe) est securisé.";
 }
elseif(@$mauvais == "true")
 {
  echo "Votre mot de passe ($passe) n'est pas s&eacute;curis&eacute;.";
 }
?>


Mais ca me met toujours "Votre mot de passe () est sécurisé", même quand il est présent dans le fichier...sad.gif

Merci de m'avoir répondu wink.gif
rottman
Essaye :

CODE
<?php
$nb_mots = count(file("dictionnaire_fr_1.txt"));
$mot = file("dictionnaire_fr_1.txt");
$passe = strtolower($_POST["passe"]);
for($i=0;$i<$nb_mots;$i++)
{
  if(strpos($passe,strtolower($mot["".$i.""]))=="true")
      {
       $mauvais = "true";
      }
}
if($mauvais!="true")
{
 echo "Votre mot de passe ($passe) est securisé.";
}
elseif($mauvais == "true")
{
 echo "Votre mot de passe ($passe) n'est pas s&eacute;curis&eacute;.";
}
?>
Thanh
Moi je veux rentrer le mot de passe que je veux, car je le retiens au moins.
david96
Pareille, je pense que comme dit Dash MD5 est un excellent choix. Simple et efficace.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.