secure - Regex para contraseña PHP
regular expressions (5)
Encuentro que hacerlo en una gran expresión regular es un poco una pesadilla de mantenimiento de código. Es mucho más fácil descifrarlo para que otra persona mire tu código, y también te permite enviar mensajes de error más específicos.
$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
}
Esta pregunta ya tiene una respuesta aquí:
- Referencia - Validación de contraseña 1 respuesta
Encontré un script en línea y tiene una contraseña regex en JavaScript. Todavía quiero usarlo, pero para mayor seguridad también quiero usar PHP para validar mi contraseña, pero soy inútil con Regex.
Los requisitos:
- Debe tener un mínimo de 8 caracteres
- Debe contener al menos 1 número
- Debe contener al menos un carácter en mayúscula
- Debe contener al menos un carácter minúsculo
¿Cómo puedo construir una cadena regex para cumplir con estos requisitos?
Esto comprueba min. 1 número y también min / max caracteres:
^(?=.*/d)(?!.*/s).{4,8}$
Un posible patrón de expresiones regulares es:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*/d)[a-zA-Z/d]{8,}$/
Como en este example .
¡Pero no deberías limitar las contraseñas!
Admitelo. Como desarrollador, hemos hecho más para contribuir al fracaso de la seguridad en línea de nuestros clientes y usuarios porque somos demasiado obstinados o perezosos para manejar las contraseñas correctamente. Solo mira algunos de los frutos de nuestro trabajo:
La contraseña debe tener entre 5 y 32 caracteres de longitud. Los caracteres válidos incluyen letras, números y guiones bajos.
La contraseña debe tener entre 6 y 12 caracteres de longitud. Los caracteres válidos incluyen letras y números.
La contraseña debe tener un mínimo de 8 caracteres y contener al menos una letra mayúscula, un número y un carácter especial, como un guión bajo o un signo de exclamación.
Luego está esta joya. Los requisitos originales eran un mínimo de 8 caracteres. Colocar accidentalmente 7 caracteres hace que aparezca un error ante el usuario:
Limitación de contraseña incorrecta Nota la línea de etiqueta. ¿Ironía?
Podría seguir aquí, pero creo que entiendes el punto. Hemos escrito un código para apoyar esta tontería, envolviendo nuestras cabezas en la expresión regular correcta para dar cuenta de cada caso. Agonizando por transmisión, hash y almacenamiento. Hemos hablado de esto tanto que la situación incluso ha recibido un estado de cultura pop apropiado con su memorialización en xkcd.
No hay duda de que nuestras intenciones fueron buenas. Después de todo, no se puede esperar que los usuarios y clientes se protejan adecuadamente. No crean contraseñas seguras, usan la palabra ''contraseña'' como su contraseña más de las veces. No prestan atención a las advertencias, las noticias o el horror expresado por amigos que han sufrido el robo de identidad. La piratería de las grandes cadenas minoristas les facilita muy poco. Nosotros, como desarrolladores, nos propusimos ayudar a nuestros usuarios a evitar estos inconvenientes. Voy a decir que nuestros intentos se quedaron cortos y que incluso pudieron haber contribuido al problema.
Es muy probable que lo hayamos empeorado.
Al poner restricciones arcanas a las contraseñas, hemos forzado a nuestros usuarios a una mala forma de pensar y, por lo tanto, les hemos hecho buscar la ruta de las contraseñas simples, menos resistentes y más fáciles de atacar. Hicimos esto porque estábamos acostumbrados a las restricciones sobre nosotros. Los administradores de sistemas nos limitaban a 8 caracteres, por lo que proyectamos el límite en el resto del mundo. Es hora de que nos detengamos y aprendamos a manejar cualquier longitud de contraseña con cualquier carácter incluido. Es posible que deseemos excluir los espacios en blanco de la contraseña, pero aparte de eso, no deberíamos poner ninguna restricción a las contraseñas.
Entonces podemos alentar buenas prácticas de seguridad, como frases de acceso o palabras aleatorias. Los usuarios, una vez que descubran esto, estarán felizmente felices de que no tengan que recordar alguna combinación tonta de letras y números como f @ rtp00p.
Puedo verte girando tus ojos. Significa que tienes que aprender cómo contraseñas hash correctamente y cómo comparar las contraseñas ingresadas con los hashes. Tendrás que lanzar un poco de regex muy difícil de ganar. ¡No lo quiera, quizás tenga que refactorizar algún código! Las bases de datos pueden contener contraseñas hash muy grandes y debemos aprovechar la capacidad.
Tenga en cuenta que la seguridad general de los datos recae sobre mí, el desarrollador junto con sysadmin y otros. La seguridad de la cuenta de un usuario está en ellos y no debería hacer nada para detenerlos. Personalmente, no me importa lo que mis usuarios tengan para sus contraseñas. Todo lo que hago cuando los usuarios crean sus contraseñas es proporcionar un medidor de fuerza y algunas pautas básicas:
"Hemos encontrado que usar frases de contraseña o combinaciones de palabras múltiples es lo más seguro cuando se trata de evitar que un pirata informático, que intenta descifrar su información de inicio de sesión, tenga éxito".
¿Qué deberías hacer?
Las funciones integradas de PHP manejan la seguridad de contraseñas a la perfección , espacios, caracteres especiales y todo ... Si está utilizando una versión PHP de menos de 5.5, puede usar el paquete de compatibilidad password_hash()
.
Tenemos que eliminar las limitaciones de las contraseñas y liberar a los usuarios para que sean propietarios de su seguridad en línea. ¿Está usted en?
Expresión regular de PHP para una validación de contraseña segura
El enlace de arriba se parece a la expresión regular que deseas. Podría intentar algo como el siguiente código:
if(preg_match((?=^.{8,}$)((?=.*/d)|(?=.*/W+))(?![./n])(?=.*[A-Z])(?=.*[a-z]).*$), $_POST[''password'']):
echo ''matched'';
else:
echo ''not matched'';
endif;
^/S*(?=/S{8,})(?=/S*[a-z])(?=/S*[A-Z])(?=/S*[/d])/S*$
De la buena gente de Zorched .
-
^
: anclado al comienzo de la cadena -
/S*
: cualquier conjunto de caracteres -
(?=/S{8,})
: de al menos longitud 8 -
(?=/S*[az])
: que contiene al menos una letra minúscula -
(?=/S*[AZ])
: y al menos una letra mayúscula -
(?=/S*[/d])
: y al menos un número -
$
: anclado al final de la cadena
Para incluir caracteres especiales, solo agregue (?=/S*[/W])
, que son caracteres que no son palabras.