Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problemas Con Login

Estas en el tema de Problemas Con Login en el foro de PHP en Foros del Web. Hola a todos, soy nuevo por estos lados y ya tengo algunos meses trabajando con php.. La cuestion es que tengo un login que me ...
  #1 (permalink)  
Antiguo 11/01/2016, 16:09
 
Fecha de Ingreso: enero-2016
Mensajes: 31
Antigüedad: 8 años, 3 meses
Puntos: 0
Problemas Con Login

Hola a todos, soy nuevo por estos lados y ya tengo algunos meses trabajando con php.. La cuestion es que tengo un login que me esta dando problemas solo me ingresa con un solo usurio (con el primer usuario de la base de datos) yo creo mas usuarios y no puedo entrar.. Este es mi formulario :
<div id="formulario" >
<form action="php/login.php" method="post">
<input type="text" name="user" placeholder="User" required>&nbsp;&nbsp;
<input type="password" name="pass" placeholder="Password" required>&nbsp;&nbsp;
<input type="submit" value="Iniciar Sesion">
</form>
</div>

Y este es el codigo del login:
<?php
session_start();

$usuario=$_REQUEST['user'];
$contrasena=$_REQUEST['pass'];

require_once 'bd_conexion.php';

$conexion =retornarConexion();

$registro=mysqli_query($conexion,"SELECT * from usuarios");

while($reg=mysqli_fetch_array($registro))
{

$usuario_db=$reg['nombre'];
$contrasena_db=$reg['contrasena'];
$rol= $reg['rol'];


if($usuario==$usuario_db && $contrasena==$contrasena_db)
{
$_SESSION['nombre']=$usuario;
$_SESSION['contrasena']= $contrasena;
$_SESSION['rol']= $rol;
echo "<script>alert('Bienvenido');window.location='admi nistrador.php'</script>";
}else
{
echo "<script>alert('Usuario o Contraseña Incorrecta');window.location='../index.php'</script>";
}

}


?>

Última edición por enmanuel9713; 11/01/2016 a las 16:10 Razón: me falto una palabra
  #2 (permalink)  
Antiguo 11/01/2016, 16:54
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Problemas Con Login

Hola,

Vamos por partes.
1. Nunca utilices el $_REQUEST para obtener los valores de un formulario, si tu formulario tiene el "method" a post utiliza $_POST, si lo tienes como get utiliza $_GET.

2. Nunca debes guardar las contraseñas en texto plano en la BBDD, si es solo para hacer pruebas puede valer pero nunca para un sitio en producción.

3. Usa los valores que obtienes del formulario como filtro dentro de la query, imaginate que tienes 10,000 usuarios en la BBDD según lo que estas haciendo es cargar la RAM de PHP con 10,000 usuarios con sus contraseñas.

4. Un bucle se suele usar para hacer algo varias veces. Tu solo necesitas saber si el usuario y su contraseña son correctos nada mas ... No necesitas un bucle.

Bueno, ahora con los ejemplos.
Punto 1:
Código PHP:
session_start();

// Subirlo encima de las variables para tener acceso a la variable $conexion
require_once 'bd_conexion.php';
$conexion retornarConexion();

// Necesitas escapar las variables para usarlas correctamente en una query
$usuario    mysqli_real_escape_string($conexion$_POST['user']);
$contrasena mysqli_real_escape_string($conexion$_POST['pass']); 
Punto 2:
Utiliza las funciones password_hash y password_verify para las contraseñas, en este ejemplo me quedo con texto plano pero no deberias hacerlo. No es seguro.

Punto 3:
Código PHP:
// Crear la consulta - solo necesitas 3 datos, selecciona solo 3 datos no toda la tabla
$query      "SELECT nombre, contrasena, rol FROM usuarios WHERE nombre = '$usuario' AND contrasena = '$contrasena'";
$resultados mysqli_query($conexion$query); 
Con los valores escapados anteriormente no tienes problemas de inyeccion de codigo.

Punto 4: Elimina el bucle, no es para esto ...
Código PHP:
// Comprobar que hay un registro ...
if (null !== ($registro mysqli_fetch_array($resultados)) {
    
// Usuario logado correctamente, tanto el usuario como la contrasena coinciden

    // Puedes hacer esto, uno por uno ...
    
$_SESSION['nombre']     = $registro['nombre'];
    
$_SESSION['contrasena'] = $registro['contrasena'];
    
$_SESSION['rol']        = $registro['rol'];

    
// O bien en una sola linea, total lo sobreescries de las dos formas
    // $_SESSION = array_merge($_SESSION, $registro);
    
echo "<script>alert('Bienvenido');window.location='administrador.php'</script>";
} else {
    echo 
"<script>alert('Usuario o Contraseña Incorrecta');window.location='../index.php'</script>";

Espero que entiendas como funciona ...

Codigo completo (son los 4 puntos juntos):
Código PHP:
session_start();

// Subirlo encima de las variables para tener acceso a la variable $conexion
require_once 'bd_conexion.php';
$conexion retornarConexion();

// Necesitas escapar las variables para usarlas correctamente en una query
$usuario    mysqli_real_escape_string($conexion$_POST['user']);
$contrasena mysqli_real_escape_string($conexion$_POST['pass']);

// Crear la consulta - solo necesitas 3 datos, selecciona solo 3 datos no toda la tabla
$query      "SELECT nombre, contrasena, rol FROM usuarios WHERE nombre = '$usuario' AND contrasena = '$contrasena'";
$resultados mysqli_query($conexion$query);

// Comprobar que hay un registro ...
if (null !== ($registro mysqli_fetch_array($resultados)) {
    
// Usuario logado correctamente, tanto el usuario como la contrasena coinciden

    // Puedes hacer esto, uno por uno ...
    
$_SESSION['nombre']     = $registro['nombre'];
    
$_SESSION['contrasena'] = $registro['contrasena'];
    
$_SESSION['rol']        = $registro['rol'];

    
// O bien en una sola linea, total lo sobreescries de las dos formas
    // $_SESSION = array_merge($_SESSION, $registro);
    
echo "<script>alert('Bienvenido');window.location='administrador.php'</script>";
} else {
    echo 
"<script>alert('Usuario o Contraseña Incorrecta');window.location='../index.php'</script>";

Un saludo,

Última edición por x_atrix; 12/01/2016 a las 07:03
  #3 (permalink)  
Antiguo 12/01/2016, 11:59
 
Fecha de Ingreso: enero-2016
Mensajes: 31
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: Problemas Con Login

ok muchas gracias :3 me salvaste y si entendi, otra cosa como que no use texto plano para las contraseñas?

Etiquetas: formulario, login, registro, select, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:07.