Foros del Web » Programando para Internet » PHP »

Validación de password entre ficheros, que se resiste.

Estas en el tema de Validación de password entre ficheros, que se resiste. en el foro de PHP en Foros del Web. Hola foreros: Aclaro de entrada que soy novato. Pues bien, tengo dos ficheros entre los que intento hacer una validación de clave de acceso a ...
  #1 (permalink)  
Antiguo 06/04/2014, 16:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 1
Validación de password entre ficheros, que se resiste.

Hola foreros:
Aclaro de entrada que soy novato. Pues bien, tengo dos ficheros entre los que intento hacer una validación de clave de acceso a una página, el home.php y el validación.php (son ficheros "adaptados" para presentar en el foro, los originales son muy extensos, pero he resumido las partes de la validación que son las que contienen el problema).

La estructura de la validación de password es dar 3 intentos disponibles, pasados los cuales sin haber dado con una clave correcta, se redirecciona a la Wikipedia.

El fichero home.php, por el que se ingresa al sistema de ficheros:

Código HTML:
<?php

ob_start();
session_start();

if(!isset($_SESSION['cont'])){ // Para sesión aún no inicializada.
	$_SESSION['cont']=3; // Intentos permitidos.
	$_SESSION['conforme']='no'; /* Variable que indica estado de validación entre home.php y validación.php: 3 valores posibles: 'no', 'si' y 'entrar'. */
	$claves=array('clave1','clave2','clave3','clave4','clave5'); // Vector de claves posibles.
	$_SESSION['dim']=count($claves); // Cantidad de claves posibles, usada en un ciclo for.
}

?>

<?xml version="1.0" encoding="UTF-8"?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
<html xmlns=http://w3.org/1999/xhtml xml:lang="en">

<head>
<title>Acceso</title>
</head>

<body style="background-color:#BBBBBB">

<?php 

if($_SESSION['cont']==3 && $_SESSION['conforme']=='no'){ // Pantalla inicial de pedido de primer ingreso de clave.

	echo "<p>Estimado Visitante:<br />Identifíquese con su clave de acceso.</p>"; 

	echo "<form action=\"validacion.php\" method=\"post\">
	<p>Clave de acceso: 
	<input name=\"clave\" id=\"clave\" type=\"password\" size=\"25\" maxlength=\"20\" value=\"\" />
	<input name=\"enviar\" id=\"buttons\" type=\"submit\" value=\"ENVIAR\" />
	<input name=\"borrar\" id=\"buttons\" type=\"reset\" value=\"BORRAR\" />
	</p></form>";

}elseif($_SESSION['cont']!=3 && $_SESSION['conforme']=='si'){ // La clave se validó correctamente en validacion.php.

	$_SESSION['conforme']='entrar';

	echo "<p>Bienvenido a la página<br />Pulse el botón y entre a la misma...</p>";

	echo "<form action=\"validacion.php\" method=\"post\">     
	<input name=\"clave\" id=\"clave\" type=\"hidden\" size=\"25\" maxlength=\"20\" value=\"".$_POST['clave']."\" />
	<input name=\"entrar\" id=\"buttons\" type=\"submit\" value=\"ENTRAR A LA PÁGINA\" /></p></form>";

}elseif($_SESSION['cont']<3 && $_SESSION['cont']>0 && $_SESSION['conforme']=='no'){ // Si quedan intentos disponibles...

	$_SESSION['cont']-=1;

	echo "<p>Clave de acceso incorrecta. Inténtelo de nuevo ( le resta(n) '".$_SESSION['cont']."' intento(s) ):</p>"; 
	echo "<form action=\"validacion.php\" method=\"post\">
	<p>Clave de acceso: 
	<input name=\"clave\" id=\"clave\" type=\"password\" size=\"25\" maxlength=\"20\" value=\"\" />
	<br /><br />
	<input name=\"enviar\" id=\"buttons\" type=\"submit\" value=\"ENVIAR\" />
	<input name=\"borrar\" id=\"buttons\" type=\"reset\" value=\"BORRAR\" />
	</p></form>";	

}elseif($_SESSION['cont']==0){ // Se acabaron los intentos disponibles: dirige a www.wikipedia.org.
	session_destroy();
	header('Location: http://www.wikipedia.org');
}

ob_end_flush();

?>

</body>

</html> 

... y el de validación.php:

Código HTML:
<?php

ob_start();
session_start();

if($_SERVER['REQUEST_METHOD']=='GET'){ // No hay sesión definida: dirige a home.php.
	header('Location: home.php');
}

$claves=array('clave1','clave2','clave3','clave4','clave5');

if($_SESSION['conforme']!='entrar'){ // Proceso de validación: recorro todas las claves hasta encontrar una coincidencia.

	for($i=0;$i<$_SESSION['dim'];$i++){

		if($_POST['clave']==$claves[$i]){
			$_SESSION['conforme']='si';
			break;
		}
	}

	$_SESSION['cont']-=1;
	header('Location: home.php');

} // Fin if.

session_destroy();
ob_end_flush();

?>


<?xml version="1.0" encoding="UTF-8"?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
<html xmlns=http://w3.org/1999/xhtml xml:lang="en">

<head>
<title>LA PÁGINA</title>

<script type="text/javascript">
function procesadato(x){
	alert("Tu clave ha sido: "+x+".");
}
</script>

</head>

<?php
// TRAMSMITO LA CLAVE correcta ingresada a la función procesadato().
echo "<body style=\"background-color:#294954\" onLoad=\"javascript:procesadato('".$_POST['clave']."');\">";
?>

ESTA ES LA PÁGINA.

</body>

</html> 

La clave de acceso correcta debe transferirse a una función (en nuestro caso function procesadato(x)) ya que ella contiene información para determinar la pantalla a presentar al usuario que ingresó.

Bueno, pues no hay caso, llevo 3 días con ello, sé que es una tontería, pero no la puedo encontrar. El problema es que no me sale de la pantalla primera de presentación inicial del campo de ingreso de clave.

¿Qué opináis? Gracias anticipadas.

Última edición por Profesor_Lambetain; 06/04/2014 a las 16:48 Razón: error cometido al transcribir código.
  #2 (permalink)  
Antiguo 07/04/2014, 05:03
 
Fecha de Ingreso: septiembre-2010
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Validación de password entre ficheros, que se resiste.

Bueno ¿algún alma caritativa que me pueda aportar alguna pista del fallo? Yo sigo sin poder encontrarlo. Muchas gracias.
  #3 (permalink)  
Antiguo 07/04/2014, 05:12
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Validación de password entre ficheros, que se resiste.

Buenas, creo que tu problema viene de aqui:

http://es1.php.net/session_destroy

;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 07/04/2014, 06:16
 
Fecha de Ingreso: septiembre-2010
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Validación de password entre ficheros, que se resiste.

Cita:
Iniciado por Eleazan Ver Mensaje
Buenas, creo que tu problema viene de aqui:

http://es1.php.net/session_destroy

;)
Gracias Eleazan.

Pues no logro verlo. Hay dos instrucciones session_destroy, una en cada uno de los ficheros. He probado quitando una, quitando la otra, y quitando ambas, y no hay caso.

Además, la session_destroy del home.php está inmediatamente antes de abandonar la página hacia la Wikipedia al haber agotado los 3 intentos de ingreso de clave, por tanto, esta instrucción no creo que origine el problema.

Y la session_destroy del alchivo validacion.php está inmediatamente antes de entrar a la página habiendo sido el usuario autenticado. Y a esa instrucción nunca se llega, en el file validacion.php, durante el proceso de validación (si te fijas: en todas las rutinas del proceso de validación anteriores en validacion.php hay siempre un header que redirige a home.php impidiendo llegar a esa session_destroy si el usuario no está autenticado).

Así que no sé qué hacer. Todo esto amén de los errores que pueda tener el código que os pasé, ya que no está validado porque no me funciona. Pero lo que yo estoy preguntando al foro es por algún error de bulto (grave) que pudiera estar causando el que no pueda salir de la pantalla inicial (bueno, ahora es que ni siquiera puedo entrar a ella xD).
  #5 (permalink)  
Antiguo 07/04/2014, 06:34
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Validación de password entre ficheros, que se resiste.

Hola:

Eleazan tiene razón, en "validacion.php" cuando haces "session_destroy()" la variable $_SESSION deja de existir, por tanto cuando redirecciones hacia "home.php" siempre se va a ejecutar esto:
Código PHP:
Ver original
  1. if(!isset($_SESSION['cont'])){
y nunca va a dar q este autorizado.

slds;

nup_
  #6 (permalink)  
Antiguo 07/04/2014, 07:07
 
Fecha de Ingreso: septiembre-2010
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Validación de password entre ficheros, que se resiste.

Cita:
Iniciado por nup_ Ver Mensaje
Hola:

Eleazan tiene razón, en "validacion.php" cuando haces "session_destroy()" la variable $_SESSION deja de existir, por tanto cuando redirecciones hacia "home.php" siempre se va a ejecutar esto:
Código PHP:
Ver original
  1. if(!isset($_SESSION['cont'])){
y nunca va a dar q este autorizado.

slds;

nup_
Pero es que, como aclaré en mi post anterior, la redirección a home.php se hace antes de que se ejecute sesión_destroy en validación.php. De todos modos, quitando esa sesión_destroy de validación.php, me aparece un error en home.php:

Notice: Undefined index: conforme in C:\xampp\htdocs\home.php on line 39

y creo que se refiere a esta instrucción de home.php:

}elseif($_SESSION['cont']!=3 && $_SESSION['conforme']=='si'){

por tanto, no me está reconociendo siquiera que dicha variable de sesión $_SESSION['conforme'] ha sido inicializada en la cabecera de home.php, contrariando la tesis de que siempre se pasa por allí (if(!isset($_SESSION['cont'])){), como creo que tú sugieres...
  #7 (permalink)  
Antiguo 07/04/2014, 07:40
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Validación de password entre ficheros, que se resiste.

Buenas,

El session_destroy al que me refiero, es al de validación.

Básicamente, después de un header() php sigue ejecutándose, por lo cual haría el session_destroy.

Tienes q quitarlo de ahí.
__________________
>> Eleazan's Source
>> @Eleazan
  #8 (permalink)  
Antiguo 08/04/2014, 07:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Validación de password entre ficheros, que se resiste.

Muchas gracias nup_ y Eleazan: sin vuestras aportaciones no hubiera podido resolver el problema, que creo ya lo tengo resuelto. No obstante, hago algún comentario a nup_:

Cita:
Iniciado por nup_ Ver Mensaje
Hola:

Eleazan tiene razón, en "validacion.php" cuando haces "session_destroy()" la variable $_SESSION deja de existir, por tanto cuando redirecciones hacia "home.php" siempre se va a ejecutar esto:
Código PHP:
Ver original
  1. if(!isset($_SESSION['cont'])){
y nunca va a dar q este autorizado.

slds;

nup_
Lo que marco en rojo sospecho que no es así. Justamente el que $_SESSION no deje de existir al hacer sesión_destroy me ha dado varios dolores de cabeza. Por ello, en el código que anexo (y que creo que resuelve el problema) he tenido que hacer en validación.php un unset($_SESSION['cont']) al entrar en la página ya con el usuario autenticado (si no, me era imposible trabajar, porque las variables de sesión se seguían manteniendo en mi servidor).


Cita:
Iniciado por Eleazan Ver Mensaje
Buenas,

El session_destroy al que me refiero, es al de validación.

Básicamente, después de un header() php sigue ejecutándose, por lo cual haría el session_destroy.

Tienes q quitarlo de ahí.
Bueno, ahora os anexo los códigos de los que considero ficheros definitivos que hacen la autenticación por clave de acceso. Fijaros que son sólo dos ficheros, ya que he visto muchos ejemplos en Internet que para hacer en esencia lo mismo utilizan hasta 4 ficheros. POR TANTO, CREO QUE ESTE ESQUEMA PODRÍA SER ÚTIL A OTROS FOREROS.

SÍ ME GUSTARÍA QUE ME HAGÁIS UNA CRÍTICA A ESTOS CÓDIGOS. YO NO LE ENCUENTRO FALLOS, pero 6 ojos ven más que los dos ojos de un novato como yo, ja, ja.

Muchas gracias nuevamente por vuestra dedicación.

Estos códigos están ya perfeccionados para que los podáis correr, tal cual están, en vuestros PC's:

Fichero home2.php:
Código HTML:
<?php

// session_unset();
// session_destroy();

// ob_start();
session_start();
if(!isset($_SESSION['cont'])){ // Para sesión aún no inicializada.

	$_SESSION['cont']=3;
	$_SESSION['conforme']='no';
	$claves=array('clave1','clave2','clave3','clave4','clave5');
	$_SESSION['dim']=count($claves);

echo "Intentos disponibles: ".$_SESSION['cont']."<br />";
echo "¿Está conforme la validación?: ".$_SESSION['conforme']."<br />";
echo "Cantidad de claves asignadas a usuarios: ".$_SESSION['dim']."<br />";

}

?>


<?xml version="1.0" encoding="UTF-8"?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
<html xmlns=http://w3.org/1999/xhtml xml:lang="en">

<head>
<title>Acceso</title>
</head>

<body style="background-color:#BBDDDD">


<?php
echo "Intentos disponibles: ".$_SESSION['cont']."<br />";
echo "¿Está conforme la validación?: ".$_SESSION['conforme']."<br />";
echo "Cantidad de claves asignadas a usuarios: ".$_SESSION['dim']."<br />";
?>


<?php 

if($_SESSION['cont']==3 && $_SESSION['conforme']=='no'){ // Pantalla inicial de pedido de ingreso de clave.

	echo "<p>Estimado Visitante:<br />Identifíquese con su clave de acceso (tiene 3 intentos).</p>"; 

	echo "<form action=\"validacion2.php\" method=\"post\">
	<p>Clave de acceso: 
	<input name=\"clave\" id=\"clave\" type=\"password\" size=\"25\" maxlength=\"20\" value=\"\" />
	<input name=\"enviar\" id=\"buttons\" type=\"submit\" value=\"ENVIAR\" />
	<input name=\"borrar\" id=\"buttons\" type=\"reset\" value=\"BORRAR\" />
	</p>
	</form>";

}elseif($_SESSION['conforme']=='si'){  // ORIGINAL: }elseif($_SESSION['cont']!=3 && $_SESSION['conforme']=='si'){

	$_SESSION['conforme']='entrar';

	echo "<p>¡Bienvenido a la página!</p>";

	echo "<form action=\"validacion2.php\" method=\"post\">     
	<input name=\"clave\" id=\"clave\" type=\"hidden\" size=\"25\" maxlength=\"20\" value=\"".$_SESSION['clave']."\" />
	<input name=\"entrar\" id=\"buttons\" type=\"submit\" value=\"ENTRAR A LA PÁGINA\" /></form>";

}elseif($_SESSION['cont']<3 && $_SESSION['cont'] && $_SESSION['cont']>0 && $_SESSION['conforme']=='no'){ // Si quedan intentos disponibles.

	// $_SESSION['cont']-=1;

	echo "<p><br />Clave de acceso incorrecta. Inténtelo de nuevo ( le resta(n) ".$_SESSION['cont']." intento(s) ):</p>"; 
	echo "<form action=\"validacion2.php\" method=\"post\">
	<p>Clave de acceso: 
	<input name=\"clave\" id=\"clave\" type=\"password\" size=\"25\" maxlength=\"20\" value=\"\" />
	<br /><br />
	<input name=\"enviar\" id=\"buttons\" type=\"submit\" value=\"ENVIAR\" />
	&nbsp;&nbsp;
	<input name=\"borrar\" id=\"buttons\" type=\"reset\" value=\"BORRAR\" />
	</p>
	</form>";	

}elseif($_SESSION['cont']==0){ // Se acabaron los intentos disponibles: dirige a www.wikipedia.org.
			session_destroy();
			header('Location: http://www.wikipedia.org');
}

// ob_end_flush();


?>


</body>

</html> 
Fichero validacion2.php:
Código HTML:
<?xml version="1.0" encoding="UTF-8"?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
<html xmlns=http://w3.org/1999/xhtml xml:lang="en">
<head>
<title>LA PÁGINA</title>
<script type="text/javascript">
function procesadato(x){
	alert("He entrado a la página y estoy en function procesadato. La clave transferida es: "+x);
}
</script>
</head>

<?php

// ob_start();
session_start();

if($_SERVER['REQUEST_METHOD']=='GET'){ // No hay sesión definida: dirige a home.php.
	echo "<body>";
	header('Location: home2.php');
}


$claves=array('clave1','clave2','clave3','clave4','clave5');


if($_SESSION['conforme']!='entrar'){ // Proceso de validación: recorro todas las claves hasta encontrar una coincidencia.

	$_SESSION['clave']=$_POST['clave'];
	for($i=0;$i<$_SESSION['dim'];$i++){

		if($_POST['clave']==$claves[$i]){
			$_SESSION['conforme']='si';
			break;
		}
	}

	$_SESSION['cont']=$_SESSION['cont']-1;
	header('Location: home2.php');

echo "<body>";

} // Fin if($_SESSION['conforme']!='entrar')


if($_SESSION['conforme']=='entrar'){ // 

// TRANSMITO LA CLAVE correcta ingresada a la función procesadato().
echo "<body style=\"background-color:#AAAAAA\" onLoad=\"javascript:procesadato('".$_SESSION['clave']."');\">";

unset($_SESSION['cont']);
session_destroy();
session_unset();

echo "AQUÍ VENDRÍA TODO EL CUERPO DE LA PÁGINA...";

} // Fin if($_SESSION['conforme']=='entrar')

?>

</body>
</html> 

Última edición por Profesor_Lambetain; 08/04/2014 a las 07:14 Razón: aclarar nombres de ficheros

Etiquetas: ficheros, html, password, variable
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 01:56.