[ Foro de PHP ]
Hola gentucilla.
Me he estado informando acerca de las sesiones de php para poder iniciar sesion como un usuario, con su login y pass, y para poder, de igual forma, restringir la entrada a todos los que no sean usuarios.
Pues bien, después de buscar y tal.. he visto que se puede hacer tanto como "con sesiones", como "con cookies", y he visto que la forma BUENA, es con sesiones, puesto que la información se guarda en el servidor, y no en el navegador del usuario, pero.. como yo uso servidor compartido y gratuito.. cómo puedo limitar el tiempo de sesión sin poder acceder al php.ini?
Puesto que mi web no es demasiado susceptible de ser atacada.. quizá debería no complicarme y utilizar cookies?
Qué me decís, gurús??
Y ya.. si pudiérais darme un ejemplo simple de cómo iniciar con ambos.. mi código es el siguiente ahora mismo:
archivo que recoge los datos del formulacio de user+pass:
<?php
session_start();
include("inc_cabecera.php");
// verificacion de las variables recibidas por post
$nickname=$_POST['usuario'];
$password=$_POST['clave'];
$enlace = conectar();
$sql="SELECT nmbr, ctsn FROM users WHERE nmbr='$nickname' AND ctsn='$password'";
echo $sql;
$resultado=mysql_query($sql,$enlace);
// cuanto la cantidad encontrada
$count=mysql_num_rows($resultado);
echo $count;
//si existe una coincidencia esta ok
if($count==1){
// si los datos son correctos genero session con el nombre de usuario
session_register('nickname');
//si esta correcta la informacion del usuario redirecciono a la seccion restringuida.
header("Location:inicio.php");
}
else {
//si los datos son incorrectos muestro un link hacia la pagina inicial con el formulario.
$message='<h3>Nombre de Usuario o Password Incorrectos</h3><br> <a href="index.php">Intente Nuevamente </a>';
echo $message;
}
?>
inicio de cada uno de los demás archivos que componen la web:
<?php
session_start();
//sino existe la session con el nombre de usuario redirecciono hacia la pagina de login
if(!session_is_registered('nickname')){
header("location:index.php");
}
Lo dicho, cómo podría hacerlo de forma que vosotros creáis que es mejor? Lo siento si soy un pesado, pero como sabéis.. estoy aprendiendo!! ;)
Vale, me las he ingeniado para no hacerle caso al php.ini, y lo he hecho con sesiones. Al iniciar sesión creo una variable "$_SESSION['tiempoDeSesion']", que se actualiza cada vez que recargas una página, y que almacena el tiempo que llevas logeado. Y una vez superado ese "tiempo de sesión", ejecuto un session_destroy();
No es absolutamente infalible, pero funciona..
La idea es buena, aunque no sé a qué te refieres con "tiempoDeSesión", si es el tiempo que lleva conectado o el instante en el que inició sesión. Para mí es más fiable lo segundo.
Por cierto, no te fíes sólo del "session_destroy()", que en mi experiencia tarda algo de tiempo en ser efectivo (milisegundos, pero suficiente para que una recarga de página haga creer que la sesión sigue activa). Da antes un valor "incorrecto" a las variables de sesión que uses en las comprobaciones. Por ejempo, si una sesión válida es de 20 minutos, podrías dar a ese "instante de inicio de sesión" una fecha de anteayer, de modo que al volver a comprobar, tendrías que la sesión ha caducado.
No me expliqué bien:
Al iniciar sesión me creo una variable "tiempo" (que podríamos llamar, hora de última actividad), en la que guardo la hora.
Cada vez que hago algo (submit, cambiar de página, lo que sea..), miro qué hora es, y si ha pasado más de 15 o 20 o 30 minutos (los que yo diga), de los que hay guardados en esa variable "tiempo" (tiempo de inactividad), destruyo la sesión y redirijo al login. Si no ha pasado más del tiempo permitido, el programa continúa, y la variable "tiempo", vuelve a ser la hora actual.
De esa forma, lo que tengo en cuenta es el tiempo de inactividad. Si el tio se está 3 horas trabajando con la web, no lo echaré, pero si deja la web más de 15 minutos sin hacer nada (ese es el tiempo que le he puesto por defecto), destruyo la sesión y redirijo al login.
La verdad es que llevo un par de días probándolo, y parece que va perfecto, porque al comprobar siempre que el tiempo de inactividad no ha sido superado.. en el momento en que se detecta que se supera, ya no te deja seguir, y te redirige.
Entonces lo estás haciendo de la forma correcta.
Aun así, recuerda destruir las variables de sesión, no fiarte sólo del "session_destroy".
Por cierto, en tu fuente original usas un "session_register" que está obsoleto. En su lugar, deberías cambiar directamente los elementos de SESSION: $_SESSION['nickname'] = $_POST['usuario'];
http://php.net/manual/es/function.session-register.php
También, tienes un "header" después de incluir la cabecera. El "header" sólo funcionará si no se ha enviado texto todavía.
Sabes? eso del session_register era algo que estaba utilizando pero que no sabía 100% bien cómo funcionaba..
El caso es que no lo uso. Para saber los datos del usuario que está conectado, utilizo variables de sesión como tú dices.. $_SESSION["nickname"].
Ahora lo que haré será modificar en el include que me controla la sesión ese if(session_is_registered('nickname')).. por qué lo cambio? por if (isset($_SESSION["nickname"]))??
Y el tema del header la verdad es que me está dando algún dolor de cabeza que otro... ya había leído que si había texto antes del header no me funcionaba. Y de hecho, no me funciona.. Lo había sustituido por un enlace grande de "Enhorabuena, ya puedes acceder pinchando aquí!" :P
Vale, me contesto a mí mismo.
Ya he sustituido los session_register por variables de sesión, y sí, sí se comprueban con isset($_SESSION[...
Ahora ya lo tengo un poco más claro. Me liaba el register ese. Y voy a ver si cambio el header de sitio para que me quede mas pro :P
Perdón por pesado! pero se me olvidaba una pregunta.. Cuando me dices que además del session destroy, "destruya" las variables de sesión que haya creado.. hay alguna forma de cargarmelas todas de una tacada? Sin tener que darle valores inválidos una a una? Realmente apenas uso variables de sesión más que el nickname, pero.. no se.. he leido algo de unset, pero no se bien cómo funciona.
Podría hacer algo así como unset($_SESSION[]) xD ???
Muchísimas gracias a todos!!
hola compañero jose, te puedo comentar al respecto de "Y el tema del header la verdad es que me está dando algún dolor de cabeza que otro..." puedo comentarte que puedes solucionar este problema anteponiendola funcion de php ob_start() que activa la directiva de configuracion output_buffering, si tienes dudas me lo haces saber vale.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)