web-dev-qa-db-fra.com

Regex pour le mot de passe PHP

J'ai trouvé un script en ligne et il a une expression régulière de mot de passe en JavaScript. Je veux toujours l'utiliser, mais pour plus de sécurité, je veux utiliser PHP pour valider mon mot de passe aussi mais je suis inutile avec regex.

Les exigences:

  • Doit être un minimum de 8 caractères
  • Doit contenir au moins 1 chiffre
  • Doit contenir au moins un caractère majuscule
  • Doit contenir au moins un caractère minuscule

Comment puis-je construire une chaîne d'expression régulière pour répondre à ces exigences?

31
Peter Stuart

Je trouve que le faire dans une grande expression régulière est un peu un cauchemar de maintenance de code. Il est beaucoup plus facile de le diviser pour quelqu'un d'autre qui regarde votre code, et cela vous permet également de donner des messages d'erreur plus spécifiques.

$uppercase = preg_match('@[A-Z]@', $password);
$lowercase = preg_match('@[a-z]@', $password);
$number    = preg_match('@[0-9]@', $password);

if(!$uppercase || !$lowercase || !$number || strlen($password) < 8) {
  // tell the user something went wrong
}
60
ceejayoz
^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$

De la part des bons amis de Zorched .

  • ^: ancré au début de la chaîne
  • \S*: tout ensemble de caractères
  • (?=\S{8,}): d'au moins 8
  • (?=\S*[a-z]): contenant au moins une lettre minuscule
  • (?=\S*[A-Z]): et au moins une lettre majuscule
  • (?=\S*[\d]): et au moins un chiffre
  • $: ancré à la fin de la chaîne

Pour inclure des caractères spéciaux, ajoutez simplement (?=\S*[\W]), qui est des caractères non Word.

70
Patrick Perini

Un modèle d'expression régulière possible est:

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/

Comme dans ce exemple .

Mais vous ne devriez vraiment pas limiter les mots de passe!

enter image description here

Admet le. En tant que développeur, nous avons fait plus pour contribuer à l'échec de la sécurité en ligne de nos clients et utilisateurs, car nous sommes trop têtus ou paresseux pour gérer correctement les mots de passe. Il suffit de regarder certains des fruits de notre travail:

Le mot de passe doit comprendre entre 5 et 32 ​​caractères. Les caractères valides comprennent les lettres, les chiffres et le trait de soulignement.

Le mot de passe doit comprendre entre 6 et 12 caractères. Les caractères valides comprennent des lettres et des chiffres.

Le mot de passe doit comporter au moins 8 caractères et contenir au moins une lettre majuscule, un chiffre et un caractère spécial tel qu'un trait de soulignement ou d'exclamation.

Ensuite, il y a ce joyau. Les exigences d'origine étaient un minimum de 8 caractères. Si vous introduisez accidentellement 7 caractères, une erreur apparaît devant l'utilisateur:

enter image description here

Limitation du mot de passe incorrecte Notez le slogan. Ironie?

Je pourrais continuer ici, mais je pense que vous avez compris. Nous avons écrit du code pour prendre en charge ce non-sens, enroulant nos têtes autour de l'expression rationnelle appropriée pour tenir compte de chaque cas. Atroce sur la transmission, le hachage et le stockage. Nous en avons tellement parlé que la situation a même reçu le statut de culture pop appropriée avec sa mémorisation sur xkcd.

Il ne fait aucun doute que nos intentions étaient bonnes. Après tout, on ne peut pas attendre des utilisateurs et des clients qu'ils se protègent correctement. Ils ne créent pas de mots de passe forts, ils utilisent le mot de passe Word comme mot de passe le plus souvent. Ils ne tiennent pas compte des avertissements, des reportages ou de l'horreur exprimés par des amis qui ont souffert du vol d'identité. Le piratage des grandes chaînes de vente au détail les élimine très peu. En tant que développeurs, nous nous efforçons d'aider nos utilisateurs à éviter ces écueils. J'attribuerai que nos tentatives ont échoué et ont peut-être même contribué au problème.

Nous avons probablement aggravé la situation.

En plaçant des restrictions obscures sur les mots de passe, nous avons en fait forcé nos utilisateurs à une mauvaise façon de penser et les avons donc fait chercher le chemin de mots de passe les moins résistants, simples et piratables. Nous l'avons fait parce que nous étions habitués à des restrictions sur nous. Les administrateurs système nous ont limités à 8 caractères, nous avons donc projeté la limite sur le reste du monde. Il est temps de nous arrêter et d'apprendre à gérer n'importe quelle longueur de mot de passe avec n'importe quel caractère inclus. Nous pouvons vouloir exclure les espaces blancs du mot de passe, mais à part cela, nous ne devrions pas imposer de restrictions sur les mots de passe.

Ensuite, nous pouvons encourager de bonnes pratiques de sécurité comme des phrases secrètes ou des mots aléatoires. Les utilisateurs, une fois qu'ils découvriront cela, seront extrêmement heureux de ne pas avoir à se souvenir d'une combinaison maladroite de lettres et de chiffres comme f @ rtp00p.

Je peux te voir rouler des yeux. Cela signifie que vous devez apprendre à hacher correctement les mots de passe et à comparer les mots de passe entrés avec les hachages. Vous devrez lancer des regex gagnés très durement. Que le ciel interdise que vous deviez refactoriser du code! Les bases de données peuvent contenir des mots de passe hachés très volumineux et nous devons tirer parti de cette capacité.

Gardez à l'esprit que la sécurité générale des données est sur moi, le développeur ainsi que l'administrateur système et les autres. La sécurité du compte d'un utilisateur est sur eux et je ne devrais rien faire pour les retenir. Personnellement, je me fiche de ce que mes utilisateurs ont pour leurs mots de passe. Tout ce que je fais lorsque les utilisateurs créent leurs mots de passe est de fournir un indicateur de force et quelques directives de base:

"Nous avons constaté que l'utilisation de phrases de passe ou de plusieurs combinaisons de mots était la plus sûre pour empêcher un pirate informatique, qui tente de pirater vos informations de connexion, de réussir."

Que devez-vous faire?

PHP fonctions intégrées gère la sécurité des mots de passe parfaitement, les espaces, les caractères spéciaux et tout le reste. Si vous utilisez un PHP version inférieure à 5.5 vous pouvez utiliser la password_hash()pack de compatibilité .

Nous devons supprimer les limitations sur les mots de passe et libérer les utilisateurs de leur propre sécurité en ligne. Êtes-vous dedans?

26
Jay Blanchard

expression régulière PHP pour une validation forte du mot de passe

Le lien ci-dessus ressemble à l'expression régulière que vous souhaitez. Vous pouvez essayer quelque chose comme le code ci-dessous:

if(preg_match((?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$), $_POST['password']):

echo 'matched';

else:

echo 'not matched';

endif;
2
christian.thomas