[Php-avanzado] Consulta Sesiones
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Lun Nov 17 17:26:09 ART 2014
Hola Gabriel,
El dom, 16-11-2014 a las 19:10 -0300, Gabriel Lenti escribió:
> Ah bien, mi confusion venia porque al ir para el browser no reenviaba
> directamente y me saltaba un cartel pidiendo confirmacion (o sea q
> apretara F5). Esto solo me sucedia al volver para atras hasta la
> pagina de login solamente. Ahi era cuando me volvia a loguear si habia
> cerrado la sesion (porq se reenviaban los datos del form de login).
Si cerrás la sesión, los últimos datos enviados no son los del
formulario de login, y por tanto no deberías volver a loguear... tal vez
no esté entendiendo el escenario...
> Por lo que estuve probando parece haberse solucionado con la
> redireccion (no he vuelto a ver cartel de reenvio alguno). Sigo sin
> ver de que manera afecta la cantidad de 'atras' que pueda hacer en
> este caso..
> Por que no seria confiable este metodo??
No es que no sea confiable una redirección, es que solo con redirigir
no se soluciona nada si no está acompañado del blanqueo de la sesión en
curso.
> El codigo de autenticacion es similar a lo que vimos en el curso. Es
> un script que se incluye al principio de todas las paginas
> restirindas:
>
>
> auth.php:
> <?php
> session_start();
>
>
> $user = "";
> $pass = "";
>
>
> if(isset($_SESSION["user"]) && isset($_SESSION["pass"]) ) {
> $user = $_SESSION["user"];
> $pass = $_SESSION["pass"];
> }
>
>
> /* --- Esta parte comentada es la que paso al redirect.php ---
> if(isset($_POST["user"]) && isset($_POST["pass"]) ) {
> $user = $_POST["user"];
> $pass = $_POST["pass"];
> }
> */
Esto solo te permitiría reloguearte en el único caso en que la página
anterior sea la de login... lo cual es obvio porque el nevegador vuelve
a enviar los datos del POST
> if($user != "" && $pass != "") {
> $account='';
>
> // recupero los datos asociados al user:
> $sql = "SELECT id,pass,adm
> FROM investigadores
> WHERE est=1 AND user=?";
>
> if (!(@$stmt = mysqli_prepare($dbh, $sql))) {
> header("Location: ".$subdir."../login.php?m=1");
> }
> if (!(@mysqli_stmt_bind_param($stmt, "s", $user))) {
> header("Location: ".$subdir."../login.php?m=1");
> }
> if (!(@mysqli_stmt_execute($stmt))) {
> header("Location: ".$subdir."../login.php?m=1");
> }
> if (!(@mysqli_stmt_bind_result($stmt, $id, $hash, $adm))) {
> header("Location: ".$subdir."../login.php?m=1");
> }
> // numero de resultados:
> @mysqli_stmt_store_result($stmt);
> @$total = mysqli_stmt_num_rows($stmt);
>
>
> // si el user existe, verifico el passwd:
> if($total === 1) {
> // recupero id de cuenta y perfil:
> @mysqli_stmt_fetch($stmt);
>
>
> if (@validar_pass($dbh, $hash, $pass)) { // hashea el passwd ingresado
> y compara.
> // si se verifica el passwd se asigna el nivel de acceso
> correspondiente:
> $_SESSION["user"] = $user;
> $_SESSION["pass"] = $pass;
> $_SESSION["perfil"] = ($adm)? 5 : 1;
> $_SESSION["id"] = $account;
> @mysqli_stmt_close($stmt);
>
>
> } else {
> // si el passwd es incorrecto, vuelvo al formulario de ingreso:
> $_SESSION["user"] = "";
> $_SESSION["pass"] = "";
> $_SESSION["perfil"] = -1;
> $_SESSION["id"] = -1;
> @mysqli_stmt_close($stmt);
> header("Location: ".$subdir."../login.php?m=3");
> }
>
>
> // si el user no existe, redirijo al form:
> } else {
> $_SESSION["user"] = "";
> $_SESSION["pass"] = "";
> $_SESSION["perfil"] = -1;
> $_SESSION["id"] = -1;
> header("Location: ".$subdir."../login.php?m=2");
> }
>
>
> // sin user voy al form:
> } else {
> $_SESSION["user"] = "";
> $_SESSION["pass"] = "";
> $_SESSION["perfil"] = -1;
> $_SESSION["id"] = -1;
> header("Location: ".$subdir."../login.php?m=4");
> }
>
Cuanto código repetido en la condición de salida! Se podría mejorar con
una función o algo que reciba como parámetro a dónde ir y el código de
error.
Por otra parte, es muy posible que el problema que veías sea por estar
asignando vacíos a las variables de sesión solamente... está bueno
además matar las variables con unset() y matar la sesión luego con
session_destroy() ... y de ser posible clavarle una estaca de madera en
el corazón mientras se le pegan 7 tiros con balas plata ;-)
> Gracias por la ayuda!! Saludos
=mente!
--
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
Más información sobre la lista de distribución Php-avanzado