Problema en php/autentificación.

Kr4n3oK

La cosa es que he realizado un sistema de autentificación y la parte en la que deberia de buscarme y comprarme password se la salta, es decir, un usuario que exista en la base de datos puede acceder a aplication.php sin necesidad de poner su contraseña, es un tanto raro xdd.

Os pego código a ver si alguno puede ayudarme, gracias.

<?php

//******Cabeceras**************
include("mod_conex.php");
//*****************************

//********Convertimos las variales POST a variables mas manejables*****
//****************Recibidas desde index.php****************************
$user = $_POST['user'];
$pass = md5($_POST['pass']);
//********************************************************************
//Comprobamos la veracidad de los datos buscados en la base de datos
	//Hacemos dos querys a la DB, una sacando el usuario, y la siguiente saca el password de ese usuario
	$checkuser = mysql_query("select username from users where username = '$user'");
	$checkpass = mysql_query("select password from users where username = '$user'");
	//**************************************************************************************************
	//**********Comprobamos que ese usuario existe en la base de datos y además que su contraseña es la indicada
	if ($user=@mysql_fetch_array($checkuser) && $pass=@mysql_fetch_array($checkpass)){
			//Si los datos son veraces, creamos una sesión para este usuario, redirigimos a la aplicación y damos paso.
			session_start();
			$_SESSION["autentified"] = "si";
			$_SESSION["user"] = $_POST["user"];
			$_SESSION["pass"] = $_POST["pass"];
			header ("Location: aplication.php");

			//*********Si falla la autenticación de cualquier modo reenviamos a index.php***********
	}else{
		header ("Location: index.php?errus=1");
}

//************************************Fin de autenticación*******************************************

?>
J

$user = mysql_real_escape_string($POST['user']);
$pass = md5($
POST['pass']);

$query = mysql_query("SELECT password WHERE username = {$user} LIMIT 1");

if (mysql_nuw_rows($query)) {

...

}

Kr4n3oK

Podrias explicar un poco?¿, aunque creo que incluso poniendo que la pw no pueda estar vacia también se solucionaria no?

J

$user = mysql_real_escape_string($_POST['user']);

$query = mysql_query("SELECT password WHERE username = {$user} LIMIT 1");

if (mysql_nuw_rows($query)) {

$usuario = mysql_fetch_array($query);

if ($usuario['password'] == md5($_POST['pass'])) {

/* el pass coincide */

} else {

/* el pass no coincide */

}

} else {

/* el user no existe */

}

1 respuesta
Fr4nk0

Estás haciendo una asignación en el if, en vez de una comparación. Debes usar == para comparar el usuario y el password.

De todas formas, cuando haces @mysql_fetch_array($checkuser), eso te devuelve un array de tamaño igual a los campos requeridos en la consulta. Por lo que no creo que hacendo $user == @mysql_fetch_array($checkuser) te funcione. En todo caso debería ser como dice #4, haciendo
$usuario = @mysql_fetch_array($checkuser); y luego if($usuario['username']== $user && .... )

Yo pondría el código estructurado como te ha dicho #4 ya que queda mucho más claro.

Un saludo

Kr4n3oK

Soy un poco noob, debo ir aprendiendo.

Fr4nk0

Todos hemos pasado por lo mismo, no te preocupes. Así es como se aprende

eXtreM3

Ah, y no hagas 2 querys para traerte en una el usuario y en otra la contraseña, hazlo en la misma y luego recoges los valores con un mysql_fetch_row($query);

C

Te propongo otra solución mucho más fácil:

Lo primero:

Haz una sola consulta:

$checkuser = mysql_query("select username from users where username = '$user' and password = '$pass'");

Después aplicas la función mysql_num_rows que devuelve el número de registros.

Si devuelve 1 es que ha encontrado un usuario con ese nombre y esa contraseña por lo que es cierto que existe:

if (mysql_num_rows($checkuser)){

// Hacer lo que sea

}

Mucho más sencillo.

C
<?php
session_start();
//******Cabeceras**************
include("mod_conex.php");
//*****************************

//********Convertimos las variales POST a variables mas manejables*****
//****************Recibidas desde index.php****************************
$user =  mysql_real_escape_string($_POST['user']);
$pass = md5(mysql_real_escape_string($_POST['pass']));
//********************************************************************
//Comprobamos la veracidad de los datos buscados en la base de datos
        //Hacemos dos querys a la DB, una sacando el usuario, y la siguiente saca el password de ese usuario
        $checkuser = mysql_query("select * from users where username = '$user' and password = '$pass'");
        
//************************************************************************************************** //**********Comprobamos que ese usuario existe en la base de datos y además que su contraseña es la indicada if (mysql_num_rows($checkuser)){ //Si los datos son veraces, creamos una sesión para este usuario, redirigimos a la aplicación y damos paso. $_SESSION["autentified"] = "si"; $_SESSION["user"] = $_POST["user"]; header ("Location: aplication.php"); //*********Si falla la autenticación de cualquier modo reenviamos a index.php*********** }else{ header ("Location: index.php?errus=1"); } //************************************Fin de autenticación******************************************* ?>

Eso está mejor.

He hecho algunos cambios.

Lo primero es empezar la sesión pase lo que pase. Es lo más correcto y lo recomendado por PHP, puedes tener problemas si no lo haces.

Debes escapar el usuario y la contraseña para evitar SQL Injection y demás historias.

Te he puesto sólo una consulta a la BD.

El mysq_num_rows que te dije antes.

No guardes la contraseña de nadie en una variable de sesión y menos sin cifrar como estaba antes. Por ello la he quitado de $_SESSION

Y ya está

Saludos.

1

Usuarios habituales