sql >> Base de Datos >  >> RDS >> Mysql

Contraseña de comparación de PHP y MySQL

Veo que está almacenando un hash de la contraseña en la base de datos, pero para el beneficio de otros lectores, nunca almacenar contraseñas en texto sin formato en la base de datos. No quieres ser como Monster.com.uk !

Debería usar una función hash más fuerte que MD5() . Idealmente, debería usar SHA256. Este método hash está disponible en PHP usando hash() función.

También debe aplicar una salt aleatoria. a la contraseña. Almacene un valor de sal diferente para la cuenta de cada usuario. Esto ayuda a derrotar los ataques de diccionario y rainbow table ataques.

Deberías aprender a usar el mysqli extensión en lugar de la antigua extensión mysql. Mysqli admite consultas parametrizadas, por lo que puede reducir la vulnerabilidad a algunos ataques de inyección SQL.

Aquí hay un código de ejemplo. No lo he probado, pero debería estar bastante cerca de funcionar:

$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;

Algunas otras personas sugieren que la consulta debería probar login = ? AND password = ? pero no me gusta hacer eso. Si hace esto, no puede saber si la búsqueda falló porque el inicio de sesión no existía o porque el usuario proporcionó una contraseña incorrecta.

Por supuesto, no debe revelar al usuario cuál fue la causa del intento fallido de inicio de sesión, pero usted es posible que necesite saberlo, para poder registrar actividades sospechosas.

@Javier dice en su respuesta que no debe recuperar la contraseña (o el hash de contraseña en este caso) de la base de datos. no estoy de acuerdo

Javier muestra llamar a md5() en código PHP y enviando la cadena hash resultante a la base de datos. Pero esto no admite saltear la contraseña fácilmente. Tienes que hacer una consulta por separado para recuperar la sal de este usuario antes de poder hacer el hash en PHP.

La alternativa es enviar el texto sin formato contraseña a través de la red desde su aplicación PHP a su servidor de base de datos. Cualquiera que intervenga en su red puede ver esta contraseña. Si tiene consultas SQL registradas, cualquier persona que obtenga acceso a los registros puede ver la contraseña. Los piratas informáticos motivados pueden incluso bucear en la basura para encontrar medios de copia de seguridad del sistema de archivos antiguos, ¡y podrían leer los archivos de registro de esa manera!

El menor riesgo es obtener la cadena hash de la contraseña de la base de datos en la aplicación PHP, compararla con el hash de la entrada del usuario (también en el código PHP) y luego descartar estas variables.