BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

Código PHP para login en web que no funciona

JnK

Necesito que alguien me eche una mano porque, por más que miro y remiro, no encuentro la solución.

Os explico: He seguido un tutorial para crear una página de login y registro para mi web (en realidad es sólo de login para una intranet). Por la parte de registro, todo ok, ya que me crea los datos en las tablas de MySQL. Por la parte de login, también, ya que me salta el mensaje que me he identificado correctamente.

Pero ahí empieza mi problema. Me he logueado correctamente, pero se queda en esa página.

Si en la página que quiero limitar el acceso a través del login, añado este código de PHP al inicio de la misma, se queda la página en blanco y no carga nada.

¿Alguna ayuda, por favor? Seguro que me estoy saltando una tontería, pero no soy capaz de dar con ello.

Gracias de antemano a todos.

login.php

<?php
include('config.php');
session_start();
if (isset($_POST['login'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$query = $connection→prepare("SELECT * FROM users WHERE USERNAME=:username");
$query→bindParam("username", $username, PDO::PARAM_STR);
$query→execute();
$result = $query→fetch(PDO::FETCH_ASSOC);
if (!$result) {
echo '<p align="center" class="error"><b><font size="5px" color="red">Usuario o contrase&ntilde;a no v&aacute;lidos< /b></font></br></p>';
} else {
if (password_verify($password, $result['password'])) {
$_SESSION['user_id'] = $result['ID'];
echo '<p align="center" class="success"><b><font size="5px" color="green">Has iniciado sesi&oacute;n correctamente< /b></font></br></p>';
} else {
echo '<p align="center" class="error"><b><font size="5px" color="red">El usuario no existe o la contrase&ntilde;a no es v&aacute;lida< /b></font></br></p>';
}
}
}
?>

Y, si añado esto a mi página, se queda en blanco:

<?php
session_start();
if(!isset($_SESSION['user_id'])){
header('Location: login.php');
exit;
} else {
}
?>
LoboAnonimo

Muestranos el codigo de la pagina login.

Hay practicamente 2/3 soluciones:

1) Despues de hacer el login, cargar el contenido que quieres mostrar a los usuarios logeados.

2) Guardar un cookie, redireccionar el trafico a otra pagina (pagina principal o lo que sea), y con el cookie mostrarle el contenido de "logeado".

3) Guardar una session, rediccionar el trafico a otra pagina, y con la session ver que esta logeado/conectado y mostrarle su contenido.

🗨️ 11
JnK

Perdón, he ido a pegarlo y se me ha padado xD

🗨️ 10
LoboAnonimo
1

Si te sale en blanco, seguro que tienes algún error por algun lado.

Añade esto tras <?php e intentalo de nuevo:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Tambien seria bueno poner session_start(); al principio de tu config.php. Asi no lo tienes que poner manualmente en todas las páginas.

🗨️ 9
JnK

Fatal error: in /…/…/…/index.php on line 10

Que corresponde con

header('Location: login.php');

🗨️ 8
JnK
🗨️ 1
lhacc
🗨️ 4
JnK
🗨️ 3
lhacc
🗨️ 2
JnK
🗨️ 1
lhacc
Pau Nadeu

¿Que versión de PHP corres? ¿Puedes quitar el exit de después del header? No es necesario.

🗨️ 3
lhacc

No es necesario pero no es buena idea dejarlo. Si no, enviarás al cliente el código html de la página, que no va a llegar a ver e incluso podría contener datos que no quieres que el cliente sin sesión iniciada pueda ver.

JnK

PHP 7.3 Voy a probar a ver

pepejil

Por buenas prácticas, siempre se debe meter un exit(); tras forzar una nueva ejecución con una redirección. Si tienes más código pasado ese location: se procesará y funcionará como no te esperas.

jamad92
1

En primer lugar pondría un echo en el if ese que comprueba la sesión y devuelve el contenido de la variable si existe. Por lo que parece no está entrando al correcto si no que siempre te dice que no estás autenticado.

Si el valor es correcto y usas Linux se me ocurre comprobar los permisos del login.php

Por otro lado se me ocurre que el 500 del redirect pueda ser por contener el espacio o al menos eso he visto por stackoverflow.

🗨️ 1
JnK

En sí, lo que hago es en esa propia página, decirle que en su mismo subdirectorio vaya a login.php y es cuando me da el error.

Sin embargo, si voy a web.com/login, me dice como que me he identificado correctamente.

Me estoy volviendo loco :s

Gracias a todos

pepejil
1

La página se queda en blanco porque estás planteando mal las condiciones.

Para empezar, estás poniendo un if (isset($_POST['login'])) { y pretendes hacer una redirección 302 de nuevo al login.php como GET y no como POST. Al hacer esto, como tienes la salida HTML dentro de esa condición, evidentemente te saldrá en blanco.

Ya que has planteado un $_SESSION['user_id'] como forma de saber que el usuario ha pasado un formulario de login y ha hecho login correcto, usa este array para validar las páginas que debe ver un usuario logueado (con su ID) y los que no.

Y si me permites, unos consejos sobre tu código:

  • Sanea las cadenas de texto introducidas por el usuario antes de pasarlos por una query de MySQL si no quieres que te hagan un SQL Injection.
  • Usa null coalescing al definir las variables de _GET y/o _POST, porque puedes tener errores de variables no definidas si se fuerza POST con otros nombres de campo.
  • Jamás uses asteriscos en los SELECT. En tu caso, llama a consulta sólo las tablas de ID y password. Haz que la aplicación use la información que realmente necesite. Hazlo tanto por uso de recursos como por seguridad.
  • Las consultas SQL y sus resultados que no uses, libéralas de la ejecución tan pronto como sean posibles.
  • Ten siempre un log de errores a mano. No sé qué servicios estás usando, pero si no tienes claro como leer los logs, modifica el fichero "php.ini" para montar tu propio manejador de errores.
🗨️ 4
JnK

Muchas gracias por la info ;)

Pero, ¿me podrías ayudar con el código? Tema php no controlo, estoy empezando ahora con ello

🗨️ 3
pepejil

Simplemente, añade una nueva condición para mostrar texto cuando la petición es GET (que es lo que hace precisamente el header:location), más o menos así:

include('config.php');

session_start();

if (isset($_POST['login'])) {

	$username = $_POST['username'];

	$password = $_POST['password'];

	$query = $connection→prepare("SELECT * FROM users WHERE USERNAME=".$username);

	$query→bindParam("username", $username, PDO::PARAM_STR);

	$query→execute();

	$result = $query→fetch(PDO::FETCH_ASSOC);

	if (!$result) {

		echo 'p align="center" class="error"><b><font size="5px" color="red">Usuario o contrase&ntilde;a no v&aacute;lidos</font/br/p';

	} elseif (password_verify($password, $result['password'])) {

		$_SESSION['user_id'] = $result['ID'];

		echo 'p align="center" class="success"><b><font size="5px" color="green">Has iniciado sesi&oacute;n correctamente</font/br/p';

	} else {

		echo 'p align="center" class="error"><b><font size="5px" color="red">El usuario no existe o la contrase&ntilde;a no es v&aacute;lida</font/br/p';

	}

} else {
	echo 'p align="center" class="error"><b><font size="5px" color="red">No se ha introducido ningún dato</font/br/p';
}

(Te he corregido también el query, ya que no hacía referencia a ningún sitio).

De todas formas, no entiendo ese "config.php" que incluyes, cuando no veo ninguna variable definida ajena en tu código.

PD: Para que te sea más fácil de depurar, tabula siempre, especialmente si empiezas a usar muchas condiciones IF/ELSE seguidas.

🗨️ 2
JnK

He probado el código, pero me sigue saliendo ese error. El config.php sería este:

<?php
session_start();
define('USER', 'usuariobd');
define('PASSWORD', 'S3cREtO');
define('HOST', 'localhost');
define('DATABASE', 'igualqueusuario');
try {
$connection = new PDO("mysql:host=".HOST.";dbname=".DATABASE, USER, PASSWORD);
} catch (PDOException $e) {
exit("Error: " . $e→getMessage());
}
?>
🗨️ 1
pepejil
Josh
1

Para incluir correctamente en tu mensaje comandos, código, logs, nombres de archivos, etc. debes escribirlo dentro de comillas simples. Por ejemplo: `comando` se muestra como comando.

También puedes escribirlo en varias líneas, simplemente rodeándolo con sendas líneas con solo una comilla simple `:

`
comando
otro comando
`
EmuAGR

Yo te recomendaría que aprendieras algún framework tipo Laravel o Symfony que ya tienen maneras de gestionar la autenticación, mejor que PHP vainilla que tienes que hacerlo todo desde cero.

JnK

Gracias a todos por las respuestas. He probado un poco de todo, pero no he conseguido hacerlo funcionar.

Estoy probando con otro código desde 0 y, a ver qué resultado me da.

Buenas noches!

EDITO: Solucionado. Con el nuevo código (y horas de retoques), he conseguido hacer funcionar mi sistema de login.

De nuevo, gracias a todos!