Ver Mensaje Individual
  #8 (permalink)  
Antiguo 08/04/2014, 07:10
Profesor_Lambetain
 
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