strcasecmp php string security bcrypt crypt

strcasecmp - equals php string



strcmp vs.== vs.=== en PHP para verificar la igualdad de hash (4)

Creo que usar == sería suficiente en tu caso.

== verifica la igualdad sin importar el tipo, mientras que === verifica la igualdad así como el tipo.

1 == "1" = Verdadero

1 === "1" = Falso

Ya que no estamos demasiado preocupados con el tipo, lo mantendría simple e iría con == .

Estoy usando crypt() para cifrar contraseñas en PHP, y estoy tratando de encontrar la forma más segura de probar la igualdad del hash resultante al realizar las comprobaciones de contraseña.

Hay tres opciones que puedo ver:

Opción 1 - dobles iguales

function checkPassword($hash, $password) { return crypt($password, $hash) == $hash; }

Opción 2 - Triple igual

function checkPassword($hash, $password) { return crypt($password, $hash) === $hash; }

Opción 3 - strcmp()

function checkPassword($hash, $password) { return strcmp(crypt($password, $hash), $hash) === 0; }

Mi intuición me dice que la opción 1 es una mala idea, debido a la falta de verificación de tipos, y que las opciones 2 o 3 probablemente sean mejores. Sin embargo, no puedo calcular si hay un caso específico en el que === o strcmp fallarían. ¿Cuál es el más seguro para este propósito?


Cuando se trata de seguridad, prefiero usar el operador === . === asegura que los dos operandos son exactamente iguales, sin intentar acomodar algunos lanzamientos para "ayudar" a que la comparación alcance una coincidencia exitosa, ya que puede ayudar a la vez que se desarrolla gracias a un lenguaje impreciso, como PHP.

Por supuesto, uno de los operandos es de confianza. Un hash de la base de datos es confiable, mientras que la entrada del usuario no lo es.

Uno siempre puede vacilar por un tiempo, llegando a la conclusión de que no hay riesgo de usar == en un caso específico. Tal vez. Pero por ejemplo

"0afd9f7b678fdefca" == 0 is true "aafd9f7b678fdefca" == 0 is also true

ya que PHP intenta convertir el "hash" en un número (probablemente usando atoi ) que da 0. Aunque es poco probable que crypt devuelva 0, prefiero maximizar los casos en que las contraseñas no coinciden (y responder a una llamada de soporte) ) utilizando === , que permitiendo un caso raro en el que no pensé utilizando == .

En cuanto a strcmp , la función devuelve <0 o >0 si es diferente, y 0 si es igual. Pero

strcmp("3", 0003) returns 0 strcmp("0003", 0003) returns -3

Que no son sorprendentes después de todo. Un 0003 literal es en realidad un número entero, 3 y dado que strcmp espera una cadena, el 3 se convertirá a "3" . Pero eso muestra que hay alguna conversión que puede ocurrir en este caso, ya que strcmp es una función, mientras que === es parte del lenguaje.

Así que mi preferencia en ese caso va a === (que es más rápido que == todos modos).


Debería usar la función hash_equals () que está integrada en PHP. No habría necesidad de hacer tu propia función. Los hash_equals () devolverán un valor booleano.

En mi opinión, por lo general NO es una buena idea usar == o === para comparar las cadenas y mucho menos las cadenas con hash.


Eso es incorrecto, por favor mira la definición de la función. Según PHP:

Returns < 0 if str1 is less than str2;

> 0 if str1 is greater than str2,

and 0 if they are equal

Devuelve menos de 0 si str1 es menor que str2. Tenga en cuenta la frase "menos que", no devuelve solo -1, sino cualquier valor negativo. Lo mismo sucede cuando str1 es mayor que str2, pero devuelve un valor positivo, distinto de cero. Devuelve un valor positivo que puede ser 1, o cualquier número posterior.

strcmp() devuelve un número que es la diferencia entre las dos cadenas que comienzan con el último carácter que se encontró similar.

Aquí hay un ejemplo:

$output = strcmp("red", "blue");

La variable $ output con contiene un valor de 16