¡Hola lucasgo3!
He visto tu código y puedo ayudarte con algunas recomendaciones para mejorarlo, especialmente en el tema de seguridad.
- Ubicación de las variables: La posición de
$correo
y $contraseña
justo después de recibir los datos del formulario está bien. No hay problema en definirlas ahí antes de hacer la conexión a la base de datos.
- Seguridad contra inyección SQL: Para evitar problemas de seguridad, como la inyección SQL, es importante no poner las variables directamente en la consulta. En lugar de eso, te recomiendo usar sentencias preparadas (prepare y bind_param) para que la base de datos interprete los datos de forma segura. Aquí te muestro cómo modificar tu código usando una consulta preparada:
$correo = $_POST['correo'];
$contraseña = $_POST['contraseña'];
$mysqli = new mysqli("localhost", "root", "", "practicaiaw");
if ($mysqli->connect_errno) {
echo "Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
} else {
// Preparamos la consulta para evitar inyección SQL
$stmt = $mysqli->prepare("SELECT * FROM clientes WHERE Correo = ? AND Contrasena = ?");
$stmt->bind_param("ss", $correo, $contraseña); // "ss" indica que son dos strings
$stmt->execute();
$resultado = $stmt->get_result();
if ($resultado->num_rows > 0) {
echo "Usuario y contraseña correctos";
} else {
echo "Usuario o contraseña incorrectos";
}
$stmt->close();
}
$mysqli->close();
Aquí usamos $mysqli->prepare()
para crear la consulta con ?
en lugar de las variables. Luego bind_param("ss", $correo, $contraseña)
asigna $correo
y $contraseña
a esos ?
, protegiendo la consulta contra inyección SQL.
- Seguridad de la contraseña: Otra mejora importante es encriptar las contraseñas en la base de datos. Guardarlas en texto plano es arriesgado. En lugar de eso, puedes encriptarlas al momento de guardarlas usando
password_hash()
. Para verificar una contraseña, puedes usar password_verify()
. Aquí un ejemplo de cómo verificarla:
$stmt = $mysqli->prepare("SELECT Contrasena FROM clientes WHERE Correo = ?");
$stmt->bind_param("s", $correo);
$stmt->execute();
$resultado = $stmt->get_result();
if ($resultado->num_rows > 0) {
$row = $resultado->fetch_assoc();
if (password_verify($contraseña, $row['Contrasena'])) {
echo "Usuario y contraseña correctos";
} else {
echo "Contraseña incorrecta";
}
} else {
echo "Usuario no encontrado";
}
¿Cómo funciona?
password_hash()
crea un hash seguro al registrar la contraseña.
password_verify()
permite comprobar si la contraseña ingresada coincide con el hash guardado en la base de datos.
Siguiendo estos consejos, tu código será mucho más seguro y eficiente. ¡Espero que te sirva! 😊
Si tienes alguna duda adicional, ¡aquí estamos para ayudarte!