2009-06-24 5 views
1
^([[email protected]#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$ 

Cette expression régulière fonctionnerait-elle pour ces règles?Cette expression régulière fonctionnerait-elle?

  • Doit être atleast 4 caractères
  • Les personnages peuvent être un mélange de l'alphabet (majuscules/majuscule), numérique et les caractères suivants: @ # $%^& *() _ - + = | [{}]; :.? ", <>/

Il est destiné à être un mot de passe validateur La langue est PHP

+5

Si vous utilisez ceci pour la validation de mot de passe, ma question est la suivante: pourquoi limitez-vous les types de caractères qu'ils peuvent utiliser? Vous ne devriez vraiment avoir à vérifier qu'un nombre minimum de caractères – MahlerFive

+2

Et 4 caractères est trop petit pour tout ce qui mérite d'être protégé. Et si cela ne vaut pas la peine d'être protégé, pourquoi ajouter un mot de passe? –

+0

@MahlerFive Serait-ce suffisant? Veuillez noter que les mots de passe seront hachés + salés avant d'être vérifiés par rapport à la base de données. Si la vérification du nombre de caractères du mot de passe suffirait, je n'implémenterai plus cette regex. Comme je l'ai dit sur le commentaire ci-dessous, je n'ai utilisé que 4 en ce moment car il est actuellement encore en développement, et 4 caractères seraient plus faciles à taper lors de la connexion. – Nikko

Répondre

5

Oui?

Honnêtement, qu'est-ce que vous demandez? Pourquoi ne le testez-vous pas?

Si, vous voulez cependant des suggestions à l'améliorer, quelques questions:

  1. Qu'est-ce que ce regex contrôle pour?
  2. Pourquoi avez-vous un si grand nombre de caractères autorisés? Pourquoi ne pas utiliser /\w/ au lieu de /0-9a-zA-Z_/? Pourquoi avez-vous le tout dans () s?Vous n'avez pas besoin de capturer le tout, puisque vous avez déjà le tout, et ils ne sont pas nécessaires pour regrouper quoi que ce soit.

Ce que je voudrais faire est de vérifier la longueur séparément, puis vérifiez contre un regex pour voir si elle a des mauvais caractères. Votre liste de bons personnages semble être suffisamment grande pour qu'il soit plus facile de le faire de cette façon. Mais cela peut dépendre de ce que vous faites pour.

EDIT: Maintenant que je sais que c'est PHP-centrique, /\w/ est en sécurité parce que PHP utilise la bibliothèque PCRE, qui est pas exactement Perl, et dans PCRE, \w sera pas correspondance des caractères Unicode mot. Ainsi, pourquoi ne pas vérifier la longueur et assurez-vous qu'il n'y a pas de caractères non valides:

if(strlen($string) >= 4 && preg_match('[\s~\\]', $string) == 0) { 
    # valid password 
} 

Vous pouvez également utiliser le caractère peu utilisé POSIX classe [[:graph:]]. Cela devrait fonctionner à peu près de la même façon en PHP qu'en Perl. [[:graph:]] correspond à n'importe quel caractère alphanumérique ou de ponctuation, ce qui ressemble à ce que vous voulez, et [[:^graph:]] devrait correspondre à l'opposé. Pour tester si tous les caractères correspondent graphique:

preg('^[[:graph:]]+$', $string) == 1 

Pour tester si tous les caractères ne correspondent pas graphique:

preg('[[:^graph:]]', $string) == 0 
+0

J'ai testé la regex, mais je voulais juste m'assurer qu'elle est correcte, car je ne suis pas très douée pour faire des expressions régulières (comme vous pouvez le voir, l'expression rationnelle que j'ai créée n'est pas très optimisée). Fondamentalement ce que je crée ici est une expression régulière de mot de passe, et j'ai besoin d'une regex qui n'est pas stricte (ne nécessite pas que vous ayez une majuscule, un caractère spécial, un nombre etc etc), mais toujours a une liste blanche de "bons" caractères. Pouvez-vous fournir une meilleure version de mon regex? – Nikko

+0

Merci, cela semble fonctionner. – Nikko

+0

Pouvez-vous expliquer ce que [\ s ~ \\\] vérifie exactement? – Nikko

1

Regex buddy est votre ami

+2

Non ce n'est pas .... –

+1

Pourquoi pas ......? – Ankur

+2

Ce n'est pas très utile. Je sais comment écrire des expressions régulières, et je peux écrire la mienne, et si c'est trop compliqué pour moi d'écrire, je devrais demander pourquoi je dois faire le travail dans une regex. Pourquoi devrais-je payer de l'argent pour un outil qui ne peut en faire que la moitié? –

1

Vous avez oublié la virgule (,) et plein... arrêtez (.) et ajoutez le tilde (~) et l'accent grave (`) qui ne faisait pas partie de votre spécification.En outre, quelques caractères dans une déclaration de jeu de caractères doivent être échappés:

^([[email protected]#$%^&*()|_\-+=[\]{}:;"',<.>?/~`]{4,})$ 

Et que comme une déclaration de chaîne PHP pour preg_match:

'/^([[email protected]#$%^&*()|_\\-+=[\\]{}:;"\',<.>?\\/~`]{4,})$/' 
+0

J'ai modifié l'expression rationnelle originale citée pour refléter, et. , et j'ai ajouté ~ et 'aux spécifications. – Nikko

0

Je remarqué que vous avez essentiellement tous ASCII, sauf barre oblique inverse, l'espace et les caractères de contrôle au début, alors qu'en est celui-ci, au lieu ?

^([!-\[\]-~]{4,})$ 
+0

Fondamentalement ce que je crée ici est une expression régulière de mot de passe, et j'ai besoin d'une regex qui n'est pas stricte (ne nécessite pas que vous ayez une majuscule, un caractère spécial, un nombre etc etc), mais a toujours une liste blanche de "bons" caractères. Est-ce que votre regex pourrait faire ça? – Nikko

+0

Btw, en plus des données ci-dessus, j'utilise le regex avec preg_match en PHP. – Nikko

+0

Pourquoi interdisez-vous certains personnages? Et pourquoi diable autorisez-vous 4 mots de passe? –

0

Vous êtes supplémentaire échapper et n'utilisent pas certaines classes de caractères prédéfinies (comme \ w, ou au moins \ d).

En plus de cela et que vous ancrez au début et à la fin, ce qui signifie que le regex ne fonctionne que si la chaîne commence et se termine correspondant, il semble correct:

^([a-zA-Z\d\[email protected]#$%^&*()|_+=\[\]{};,."'<>?/~`]{4,})$ 

Si vous voulez vraiment dire Pour l'utiliser comme un validateur de mot de passe, il sent l'insécurité:

  • Pourquoi autorisez-vous 4 mots de passe?
  • Pourquoi interdisez-vous certains personnages? PHP ne peut pas gérer certains? Pourquoi vous en soucieriez-vous? Laissez l'utilisateur entrer les caractères qu'il veut, après tout, vous finirez par en stocker un hachage + sel.
+0

La classe de caractères \ w correspondra beaucoup plus que simplement ASCII. – Joey

+0

C'est vrai, c'est pourquoi je ne l'ai pas utilisé. –

+0

@Johannes - Seulement en Perl. Dans PCRE, je ne pense pas que ce sera le cas. –

0

Non Cette expression régulière ne fonctionnerait pas pour les règles que vous énoncez, pour le simple raison pour laquelle $ correspond par défaut avant le caractère final s'il s'agit d'un saut de ligne. Vous autorisez les chaînes de mot de passe comme "1234 \ n".

La solution est simple. Utilisez \z au lieu de $ ou appliquez le modificateur D à l'expression régulière.