1

Quería saber qué se hace para evitar las inyecciones SQL en mi script php de inicio de sesión. Ví que en muchos tutoriales enseñaban que había que generar una sal, pero mi problema es que ya tengo usuarios registrados sin salt(); así que no puedo utilizar esas scripts, y con todas las que probé ninguna me funcionaba. Mi base de datos luce así:

  • correo
  • clave
  • usuario
  • id
  • nombre
  • apellido
  • tipo (0 = requiere verificación | 1 = normal | 2 = bloqueado)

Actualmente estoy en local porque hace un rato acaban de hacer una inyección sql a mi sitio, así que pedí que me apagaran completamente para evitar graves pérdidas de datos. No entiendo porque la gente se divierte haciendo este tipo de cosas.

FOX
  • 465
  • 1
  • 5
  • 19
  • Acá seguro te pueden dar una solución. https://es.stackoverflow.com/questions/18232/c%C3%B3mo-evitar-la-inyecci%C3%B3n-sql-en-php Y acá. https://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla – FOX Sep 11 '17 at 20:05
  • Como ya te han dicho deberías usar mysqli ya que myslq está obsoleto. – Pavlo B. Sep 12 '17 at 15:22
  • Tiene que hacer consultas preparadas, ya sea con mysqli o PDO (busque documentación en la página de php.net). También con la función de password_encrypt que tiene disponible PHP desde la versión 7, esta le genera una sal automatica y también puede definir qué tan encryptada debe estar la contraseña. La solución sería modificar todas las contraseñas y agregarles el encriptado, aproveche ya que tiene su servidor caído. – Jonathan ch Sep 11 '17 at 20:04
  • Me llama la atención lo de el nuevo hash, pero tengo una duda, no será igual que el password hash, que hay que hacer un procedimiento para poder comparar la clave ingresada con la base de datos o directamente es como poner sha1($variable). y lo de las consultas preparadas leí mucho, pero no sé porque me devuelve 0 consultas, no se si será porque tengo que poner $consultapreparada->execute(); – Catalina Fernández Sep 14 '17 at 03:19

1 Answers1

0

Cosas en tener en cuenta:

Inyección de SQL

Si actualmente te han atacado, debes asumir que la información que tenías almacenada en tu base fue robada. Usualmente un hacker solo hace notar su presencia si ya no puede obtener nada más.

Envía un correo a todos tus usuarios explicando que se solicitará crear una nueva contraseña, dependiendo de la información que manejes recomendaría que les informes de la brecha de seguridad, ya que muchas personas usan la misma clave para todas sus cuentas.

Saltear las contraseñas

Usualmente el salteo de las contraseñas es cuando estos se encuentran ya en formato hash en tu base de datos. Por lo que no tengo muy claro porque te afectaría que ya existan valores en la tabla, simplemente los reemplazas con el valor generado.

Hashear Contraseñas

Si el atacante solo se llevo los valores hasheados de las contraseñas de usuarios, no hay muchos problemas. Ya que dependiendo de la encriptación usada la posibilidad de obtener la clave no es muy rentable. Si en cambio estos valores estaban en plena vista, es mejor informar a los usuarios de la brecha, implementar el hasheo de claves y solicitar la generación de nuevas claves para todas las cuentas.

Manual para generar el Hash de passwords en PHP

(http://php.net/manual/es/function.password-hash.php)

Según la documentación el proceso para generar las hash, sería el siguiente:

echo password_hash("Clave", PASSWORD_DEFAULT);

Cuando el usuario registre la contraseña, generas el hash y lo almacenas en tu base de datos en lugar de la contraseña.

Cada vez que el usuario desea hacer login, debes tomar el valor que el ingresa como contraseña y realizar el cambio a hash y es con este valor transformado realizas la comparación con la base de datos. Si son iguales accede, si son diferentes, la clave es incorrecta.

Tridam
  • 386
  • 1
  • 9
  • No sé como utilizar el password hash, porque no es tan fácil como poner sha1($clave), si me podrias explicar poco... O sea, quiero hacer algo así. Registrar con password_hash($variable) y comprabar con password_hash($variable). – Catalina Fernández Sep 14 '17 at 03:21
  • Edite la respuesta, espero que te ayude a aclarar tu duda. – Tridam Sep 14 '17 at 13:41
  • Claro, ayer a último momento me di maña. Creo que puedo hacer lo siguiente: select pass from users where email = $email y luego hago un fetch assoc y pongo una condición con una variable $verify = password_verify($pass, $row["password"]); if ($verify){echo "sessión iniciada";session_start()}else{echo "contraseña incorrecta"} – Catalina Fernández Sep 14 '17 at 16:50