Foros del Web » Programando para Internet » PHP »

Sistema de autentificación

Estas en el tema de Sistema de autentificación en el foro de PHP en Foros del Web. Hola, estoy implementando un sistema de autentificación sencillito, en la que en la página principal, se solicita un y password para acceder a la aplicación, ...
  #1 (permalink)  
Antiguo 25/07/2008, 11:10
 
Fecha de Ingreso: julio-2003
Ubicación: Sevilla
Mensajes: 81
Antigüedad: 20 años, 9 meses
Puntos: 1
Exclamación Sistema de autentificación

Hola, estoy implementando un sistema de autentificación sencillito, en la que en la página principal, se solicita un y password para acceder a la aplicación, y después en otra página llamada "control_acceso.php", coteja los datos introducidos con los que hay guardados en una base de datos, y dependiendo de si se han introducido correctamente, pues entra en la aplicación, o vuelve a la página de principal para pedrite el usuario y contraseña, nada del otro mundo, pero no sé porque me dice siempre que los datos son erróneos, incluso cuando meto los correctos. En la página principal tengo el formulario y estas dos líneas :

Código PHP:
if ($_GET["errorusuario"] == "si")
   echo 
"Datos incorrectos, vuelva a intentarlo"
control_acceso.php
Código PHP:
ob_start(); // Para que no haya problemas con el buffer de salida después al enviar cabeceras, como 'header()'
include ("conexion.php"); // incluímos la función para la conexión a la B.D.
$link Conectarse("servidor""usuario""password""base_datos"); // llama a la función del fichero anteriormente incluido
$consulta "SELECT * FROM usuarios WHERE usuario = ";
$consulta .= $_POST['user'] . " AND clave = " $_POST['passwd'];
$respuesta mysql_query($consulta$link);
// 'user' y 'passwd' son los nombres de los campo del formulario, y 'usuario' y 'clave' son los nombres de los campos de la tabla, 'usuarios', de la B.D. que es donde está guardado el nombre de usuario y la contraseña
if (mysql_num_rows($respuesta) != 0)
{
   
// usuario y contraseña válidos
   // defino una sesión y guardo los datos
   
session_start();
   
$_SESSION["autentificado"] = "SI";
   
header("Location: menu.php");
}
else
{
   
// si no existe, le mando otra vez a la portada
   
header("Location: index.php?errorusuario=si");
}
mysql_close($link); 
En cada página que quiero que se necesite autorización, le añado la siguiente línea:
Código PHP:
require_once ("seguridad.php"); 
seguridad.php
Código PHP:
// Inicio la sesión
session_start();
// COMPRUEBO QUE EL USUARIO ESTA AUTENTIFICADO
if ($_SESSION["autentificado"] != "SI")
{
// si no existe, envío a la página de autentificación
   
header("Location: index.php");
// además salgo de este script
   
exit();

¿Qué es lo que falla?, ¿porqué me dice siempre que los datos son erróneos?.


Un saludo.
  #2 (permalink)  
Antiguo 25/07/2008, 13:42
 
Fecha de Ingreso: julio-2008
Mensajes: 83
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Sistema de autentificación

Pone comillas simples antes y despues del valor de cada campo en la consulta SQL. Y si podes escapa las cadenas, asi evitas injecciones SQL.

Saludos.
  #3 (permalink)  
Antiguo 25/07/2008, 14:11
 
Fecha de Ingreso: julio-2003
Ubicación: Sevilla
Mensajes: 81
Antigüedad: 20 años, 9 meses
Puntos: 1
Exclamación Respuesta: Sistema de autentificación

Cita:
Iniciado por Thaorius Ver Mensaje
Pone comillas simples antes y despues del valor de cada campo en la consulta SQL. Y si podes escapa las cadenas, asi evitas injecciones SQL.

Saludos.
Ok, muchas gracias, era eso de las comillas simples, ¿porqué hay que ponerlas?, así lo tendré en cuenta para otras veces, porque muchas veces me lío con las comillas simples y dobles.

Ahora ya entra perfectamente, pero hay otro problema, pasa el corte del login, y entra en el menú de la aplicación y tenemos 3 opciones: insertar datos, listado y salir (elimina los datos de la sesión, destruyendo las variables de sesión), todas ellas tienen al principio la capa de seguridad, que comprueba si estás logueado, si lo estás te muestra la página, y si no, te vuelve a la página de login, en la página de Inserción de datos, entra perfectamente, aunque cuando le damos a "enviar" me vuelve a la página del login, y no hace la inserción en la B.D., y si le damos a regresar al menú, pasa lo mismo, vuelve a la página del login, en vez de al menú. y en la página de listado, ni siquiera entra, se vuelve otra vez a la página de login. ¿Qué es lo que le hace creer que no estoy logueado?.

En la opción salir del menú, tengo puesto un enlace a la función salir() de PHP, que la llamo así:
Código HTML:
<a href="<?php salir(); ?>">SALIR</a> 
Código PHP:
function salir()
{
   
session_start(); // Inicio la sesión
   
session_destroy();
   unset(
$_SESSION["autentificado"]);
   
header("Loacation: index.php");


P.D. 1: La inserción en la B.D. la realiza correctamente si quito la línea de la capa de seguridad.

P.D. 2: La línea para comprobar la seguridad que inserto en todas las páginas está en mi mensaje anterior, es la del require(), y el código de esa página que requerimos, seguridad.php, está también en el mensaje anterior.
  #4 (permalink)  
Antiguo 25/07/2008, 14:57
 
Fecha de Ingreso: julio-2008
Mensajes: 83
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Sistema de autentificación

Respecto a las comillas, en SQL, se ponen comillas simples siempre que tengas algun valor que pueda tener espacios, como tu username y password.

En PHP, en general, la unica diferencia entre comillas simples y dobles, es que si usas dobles, podes poner variables dentro de las comillas. Tambien, capaz que leiste que usar comillas simples ayuda a que el script corra mas rapido, esto si bien es verdad, es irrelevante; la ganancia en velocidad es tan pero tan pero tan minima que es irrelevante.

No veo porque hace eso tan raro tu script, pone el codigo completo, capaz que sea por otra cosa.

Saludos.
  #5 (permalink)  
Antiguo 25/07/2008, 15:28
 
Fecha de Ingreso: julio-2003
Ubicación: Sevilla
Mensajes: 81
Antigüedad: 20 años, 9 meses
Puntos: 1
Exclamación Respuesta: Sistema de autentificación

Gracias por la aclaración de lo de las comillas simples. Lo de la velocidad no lo sabía, y lo que con comillas dobles dentro podías poner variables tampoco lo sabía, con comillas dobles, para poner las variables, cerraba las comillas dobles, y antes de poner la variable, ponía el operador de unión de cadenas, el punto (.), entre las cadenas de texto y las variables. Otra cosa, lo de "escapar las cadenas, para evitar inyecciones SQL", ¿eso qué es?, ¿cómo se hace?, como puedes comprobar soy bastante novato en esto, estoy aprendiendo ahora PHP, y aunque algunas cosas me salen sin problemas, otras me cuestan más trabajo, según va aumentando la dificultad, me va costando un poco más, pero busco información en páginas especializadas, foros, libros sobre PHP, etc.

El código completo de control_acceso.php y seguridad.php están puestos en el primer mensaje, lo que está puesto es el código al completo, en cuanto a lo de insertar, ya sé porque antes no insertaba registros, porque la capa de seguridad estaba puesta en el archivo que recibe el formulario, en el que hace la inserción propiamente dicha, lo de seguridad debe de ir en la página del formulario de insertar, ahora que la coloco en su sitio correcto, me ocurre lo mismo que con el listado, que no entra en la página, y me devuelve a la página de login, en resumen, que con la línea:
Código PHP:
require_once ("seguridad.php"); 
no muestra las páginas, me redirige automáticamente a la página de identificarme, aunque aún con la línea esa quitada de las páginas, dejándola en la del menú, cuando en cualquiera de las otras páginas, le doy al botón "volver al menú principal", me devuelve a la página de identificación, y si quito también lo de la seguridad del menú, entonces ya no hay problemas, así que el problema tiene que estar o bien el archivo "seguridad.php", o bien, el "menu.php", en el 1º, en el mensaje original está puesto el código, y del 2º, las únicas líneas de código PHP que tiene son estas:

Al principio de la página, las dos primeras líneas:
Código PHP:
ob_start(); // Permite abrir el buffer de salida para poder enviar 'headers'
require_once("seguridad.php"); // código de autentificación 
Al principio del <body>:
Código PHP:
function salir()
{
// El problema, creo yo, que tiene que estar en esta en este archivo, que cuando entra en el menú de regreso de alguna de las otras páginas, por algún motivo que desconocemos, entra en esta función, y destruye la sesión y vuelve a la página de identificación
   
session_start(); // Inicio la sesión
// Destruyo la variable de sesión para que no se pueda utilizar más y tengamos que volver a loguearnos
   
session_destroy();
   unset(
$_SESSION["autentificado"]);
   
header("Loacation: index.php");

Y por último en el botón de volver al menú principal, cuando se llama a la función 'salir()':
Código HTML:
3. <a href="<?php salir(); ?>">SALIR</a> 
No sé que es lo que falla, pero parece que la clave tiene que estar en la página menu.php, que hay algo que hace que se salga siempre, puede ser por la función de salir, también debe de haber algo que falla en la capa de seguridad que incluyen todas las páginas, seguridad.php, donde se comprueba si se está logueado, ya que siempre me devuelve a la página de identificación, es posible que que algo esté mal, y piense siempre que no estoy identificado, por eso me devuelve a la página de identificación, el código de ese archivo está puesto más arriba, en el primer mensaje.

Un saludo.


P.D.: Aclarar que la función de salir de la página del menú, es en PHP, y no JavaScript, que puede dar lugar a confusiones, todos los fragmentos de código que he colocado aquí, excepto el último, aunque no aparezca, tienen, al principio y al final su bloque separador de código PHP (<?php y ?>).

Última edición por rvelezb; 26/07/2008 a las 06:02 Razón: Añadir más información
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 15:22.