Foros del Web » Programando para Internet » PHP »

Otro de Sesiones

Estas en el tema de Otro de Sesiones en el foro de PHP en Foros del Web. Hola: Tengo el siguiente script: Código PHP: <?  include( "conex.php" ); ?> <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? echo  $_POST [ 'nick' ];echo  "<br>" ...
  #1 (permalink)  
Antiguo 05/12/2003, 09:10
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Otro de Sesiones

Hola:
Tengo el siguiente script:
Código PHP:
<? 
include("conex.php");
?>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
echo $_POST['nick'];echo "<br>";
echo 
$_POST['password'];echo "<br>";
$nick=$_POST['nick'];$password=$_POST['password'];
if (
$_POST['nick']=="" or $_POST['password']=="")
{
    echo 
"debe ingresar los datos requeridos";?>
    <p><a href="ingresar.php">Volver</a></p>
<? }
else
{
    
$consultar=mysql_query("select * from users where nick='".$nick."'
    and password='"
.$password."'");
    if (
mysql_num_rows($consultar)==1)
        { 
        echo 
"usuario existe";
        
session_name("valido");
        
session_start();
        
session_register('nick');
        
session_register('password');?>
        <p><a href="salir.php">Salir</a></p>
        <? }
    else
        echo 
"usuario no existe";?>
        <p><a href="ingresar.php">Volver</a></p>
<?
}
?>
</body>
</html>
pero cuando entro con los datos correctos me aparece el siguiente Warning:

Warning: Unknown(): Your script possibly relies on a session side-effect which
existed until PHP 4.2.3. Please be advised that the session extension does not
consider global variables as a source of data, unless register_globals is enabled.
You can disable this functionality and this warning by setting session.bug_compat_42
or session.bug_compat_warn to off, respectively. in Unknown on line 0

Sinceramente no se a que se refiere.
Ojala me puedan ayudar.

Otra cosa: las variables de session duran durante todo el tiempo que se mantiene activa la session, pero me pregunto que pasa cuando hay muchos archivos de session, ¿no se confunden unos con otros? o cada archivo esta relacionado con cada usuario?

Y lo ultimo:
en mi directorio c:\php\sesiones se van creando archivos del tipo sess_kajkaijdf215edfaa5ee21 pero no solo se crean archivos con los datos de los usuarios activos, sino que de repente aparecen archivos con 0 kb y sin contenido.

Ojala me puedan ayudar.
Gracias y Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE

Última edición por KillerBKS; 05/12/2003 a las 09:25
  #2 (permalink)  
Antiguo 05/12/2003, 09:28
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
bueno, supongo que lo primero es cambiar el orden del if
Código PHP:
if (mysql_num_rows($consultar)==1)
        { 
                                session_start();
        echo "usuario existe";
        session_name("valido");
        session_register('nick');
        session_register('password');?>
        <p><a href="salir.php">Salir</a></p>
        <? }
    else
        echo 
"usuario no existe";?>
creo que deberia partir por eso....... o no?

y ojala me ayuden con lo demas

salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #3 (permalink)  
Antiguo 05/12/2003, 09:52
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Creo que es que con la version 4.3 en adelante, si tienes register_globals a off no puedes "crear" variables con session_register(). Debes usar el array superglobal $_SESSION. Asi que prueba a cambiar:
Código PHP:
session_register('nick');
session_register('password'); 
por
Código PHP:
$_SESSION['nick']=$nick;
$_SESSION['password']=$password
Punto 2: PHP no se equivoca, porque usa el session_id que propaga a cada usuario para identificar la sesion.

Punto 3: PHP crea una sesion (es decir, un fichero), si encuentra un session_start() y ese usuario no tiene creada una sesion anterior.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 05/12/2003, 09:59
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
vamos a probar, gracias

Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #5 (permalink)  
Antiguo 11/12/2003, 11:25
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Estoy tratando de hacer un Autentificador de usuarios, similar al que hizo Cluster, pero no se que estoy haciendo mal.
Tengo que siguiente script

ingresar.php
Código PHP:
<form name="form1" method="post" action="codifica.php">
<
p>Nick 
<input name="nick" type="text" id="nick">
</
p>
<
p>Password 
    
<input name="password" type="password" id="password">
</
p>
<
p>
<
input type="submit" name="Submit" value="Enviar">
</
p>
</
form
y los recibo y valido en codifica.php
Código PHP:
<? 
include("conex.php");
?>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
$validar
=0;
echo 
$_POST['nick'];echo "<br>";
echo 
$_POST['password'];echo "<br>";
$nick=$_POST['nick'];$password=$_POST['password'];
if (
$_POST['nick']=="" or $_POST['password']=="")
{
    echo 
"debe ingresar los datos requeridos";?>
    <p><a href="ingresar.php">Volver</a></p>
<? }
else
{
    
    if ((
$_SESSION['nick']==$nick) and ($_SESSION['password']==$password))
        echo 
"Usuario ya esta dentro";
    if (!isset(
$_SESSION['nick']) && !isset($_SESSION['password']))
    {
        echo 
"ya existe"$validar=1;session_destroy();?>
        <p><a href="ingresar.php">Volver</a></p>
<? }
    if(
$validar==0)
    {
    
$consultar=mysql_query("select * from users where nick='".$nick."'    and password='".$password."'");
    if (
mysql_num_rows($consultar)==1)
        { 
        echo 
"usuario existe";
        
session_name("valido");
        
session_start();
        
$_SESSION['nick']=$nick;
        
$_SESSION['password']=$password;
        
$sess_id =session_id();
        
$_SESSION['id']=$sess_id;?>
        <p><a href="salir.php">Salir</a></p>
        <? }
    else
        echo 
"usuario no existe";?>
        <p><a href="ingresar.php">Volver</a></p>
<? }
}
?>
</body>
</html>
Cuando ingreso datos de un usuario correcto me dice que "ya esta dentro" , como que ya se ha autentificado, pero no es asi, y me crea un archivo de session con 0kb.
Mi idea es crear este script y poder agregarlo en todas las paginas restringidas.

Espero me ayuden

Gracias y Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #6 (permalink)  
Antiguo 12/12/2003, 08:38
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Please.....ayuda urgente
__________________
AK.T.I.V.E.tm Live, Never DIE
  #7 (permalink)  
Antiguo 12/12/2003, 08:59
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

¿Te muestra "Usuario ya esta dentro" o "ya existe"? Si es el primero, es que se cumple:
Código PHP:
if (($_SESSION['nick']==$nick) and ($_SESSION['password']==$password))
        echo 
"Usuario ya esta dentro"
Haz un echo de esos elementos de la sesion y las variables $nick y $password. Si son iguales, es que lo esta haciendo bien.

De todas formas, ¿como estas propagando el SID? Supongo que por URL, porque estas generando salida al navegador antes del session_start(). Y hablando del session_start(), deberia ir antes de cualquier acceso a $_SESSION. Y otra cosa, las primeras comprobaciones las haces con la sesion con el nombre por defecto que tienes en el php.ini. Pero luego creas la sesion de autentificacion con otro nombre. Debes usar session_name() delante de todo session_start() para que siempre se acceda a la misma sesion.

De todas formas, yo replantearia el orden de las comprobaciones. No se, veo el codigo demasiado complejo. Muchos if sin else, con lo que puede que se cumplan varios.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 14/12/2003, 22:16
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Ya he leido y leido mucho material sobre las variables de sesion. He analizado mucho el autentificador de Cluster. He hecho muchas pruebas sobre el tema y he llegado al sgte Script:

Código PHP:
if ($_POST['nick']=="" or $_POST['password']=="")
{
    echo "debe ingresar los datos requeridos";
    exit;?>
    <p><a href="ingresar.php">Volver</a></p>
<? }
if((
$_SESSION['nick']==$nick) && ($_SESSION['password']==$password))
    echo 
"Esta autentificado ...";
$consultar=mysql_query("select * from users where nick='".$nick."' and password='".$password."'");
if (
mysql_num_rows($consultar)==1)
    { 
    
session_start();
    
session_name("valido");
    
$sess_id =session_id();
    
$_SESSION['id']=$sess_id;
    
$_SESSION['nick']=$nick;
    
$_SESSION['password']=$password;
    echo 
"usuario existe";
    
?>
    <p><a href="salir.php">Salir</a></p>
<? }
else
  {
   echo 
"usuario no existe";?>
   <p><a href="ingresar.php">Volver</a></p>
<? ?>
Me gustaria que lo analizaran y me dijieran si lo encuentran que esta bien. Hasta el momento solo tengo problemas para decidir en que lugar debo poner la validación de que el usuario ya tenga su sesion creada y permitirle el acceso.
Ojala me ayuden

Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #9 (permalink)  
Antiguo 16/12/2003, 15:47
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Alguna opinion por favor, para saber si estoy bien orientado o no

Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #10 (permalink)  
Antiguo 12/01/2004, 15:28
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Segun tengo entendido, una sesion dura mientras me mentenga navegando dentro de la misma pagina, durante todo ese tiempo la sesion permanecera activa.
Como se puede hacer si en una de las opciones de mi aplicación muestro una serie de opciones adicionales en una pagina nueva, es decir, al hacer click en un link abro una nueva pagina con mas opciones adicionales, como hago para el acceso sea permitido sin tener que pedirle al usuario que se vuelva a identificar?

Salu2
__________________
AK.T.I.V.E.tm Live, Never DIE
  #11 (permalink)  
Antiguo 12/01/2004, 15:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
KillerBKS .. eso lo consigues propagando el SID en tu link que hagas ..

De hecho . .si usas:

session.use_trans_sid = 1 .. PHP ya reescribe la mayoría de tag HTML de link (<a .. >) y similares para incrustrarle el SID en el.

Y si usas session.use_cookies = 1 (con un navegador que acepte cookies) el SID viaja en una cookie .. así que si abres links desde una página que inició una sesión y sigues usando session_start() en las que abras.. el SID es válido y podrás usar tus variables de sesión.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 12/01/2004, 15:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por cierto ..

Código PHP:
if (mysql_num_rows($consultar)==1)
    { 
    
session_start();
    
session_name("valido"); 
El nombre de la sesión que estás creando con: session_name() se define antes de un session_start() .. sino no tiene efecto y se seguirá usando como nombre de sesión el que dé PHP por defecto (PHPSEDSID o algo así ).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 12/01/2004, 16:38
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Tengo
session.use_trans_sid =On y session.use_cookies = On.
Entonces deberia enviar el id de la sesion hacia la pagina nueva que abro.
Código PHP:
<a href="pagina.php?<? echo session_id()?>">Abrir</a>
Bastaria con eso para recuperar la session y validar si el usuario ya se identifico o no?
Es decir, con eso bastaria para que el usuario continuara validado, o debo agregar algo mas es los script para obtener los valores de $_SESSION["variables"]

Espero se entienda

Salu2 !!!
__________________
AK.T.I.V.E.tm Live, Never DIE
  #14 (permalink)  
Antiguo 13/01/2004, 06:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No, .. el SID es una constante que se compone de dos partes:

Nombre de la sesión activa y el ID de esa sesión ...

El nombre lo obtienes si quieres con funciones con:
session_name()

Y el id de la sesión con:
session_id()

Así que si que si quieres propagar el SID de forma MANUAL deberias hacer:

Código PHP:
<a href="pagina.php?<? echo session_name()."=".session_id()?>">Abrir</a>
o bien usando la constante SID directamente que dá el nombre+ID de la sesión (con el = incluido):

Código PHP:
<a href="pagina.php?<? echo SID ?>">Abrir</a>

Pero, si usas las directivas:
session.use_trans_sid =On y session.use_cookies = On.

No es necesario que propages el SID tu a mano . .Es más .. con session.use_trans_sid .. veras que en los LINKS por ejemplo se está duplicando ese SID uno el que estás propagando tu a mano y el otro (el mismo) que lo hece PHP por tí.

A todo esto .. como veo que usas(bas) nombre de sesión predefinido por tí .. debes usarlo en TODAS las páginas que uses sesiones .. es decir:

Código PHP:
<?
session_name
("el nombre que le des");
session_start();
//etc uso de sesiones. y resto código ..
?>
Eso, .. tanto para registrar una variable de sesión como para leerla. Si no usas el mismo nombre de sesión en algúna de las páginas que intervengan en tu proceso .. estáras intentando leer/escribir datos en otra sesión (concretamente en la de nombre PHPSESSID o algo así que es el que dá PHP por defecto en su php.ini).

Lee detinadamente la documentación sobre sesiones de PHP.net .. Sobre todo presta atención a las directivas de configuración .. Todo lo que comento lo he leido y comprobado desde ahí.

www.php.net/session

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 13/01/2004, 12:27
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Gracias.

cuando deje terminado el sistema, se los muestro.

Salu2 !!!
__________________
AK.T.I.V.E.tm Live, Never DIE
  #16 (permalink)  
Antiguo 13/02/2004, 13:16
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Nuevas dudas:
- Como hago para establecer la duración de una sesion ?

- En el script en donde cierro la sesion es necesario poner

Código PHP:
<?
   session_start
();
   
session_unset();
   
session_destroy();
?>
Espero su gentil ayuda

Salu2 !!!
__________________
AK.T.I.V.E.tm Live, Never DIE
  #17 (permalink)  
Antiguo 13/02/2004, 14:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Normalmente en sesiones no se manejan tiempos de expiración .. por qué la sesión se usa para mantener los datos en el flujo de páginas/scripts de un proceso dado y .. siempre que propagues el SID entre ellas la sesión será válida.

Si tu abandonas tu série de páginas/scripts que usan sesiones y van propagando el SID entre ellos (sea manual o automático) .. el SID debería expirar junto con el cierre de la última página/script de esa secuencia.

Si quieres algo tipo "recordar contraseña" para tu sitio .. usa cookies que se usan junstamente para eso ..

Si quieres controlar el tiempo de expiración de las sesiones revisa en: www.php.net/session las directivas:

session.gc_maxlifetime
session.cache_expire
session.cookie_lifetime (por si usas session.use_cookies ...)

(las directivas de tu php.ini se pueden modificar también con ini_set() en tiempo de ejecución de tus scripts ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #18 (permalink)  
Antiguo 20/02/2004, 18:35
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
Hola:
Estoy teniendo un error extraño que no logro entender.
Luego de mucho leer y probar, logre crear mi script de autentificacion (Gracias Cluster por tu ayuda), el script funciona correctamente y hace lo que debe hacer, es decir, no permitir el acceso a zonas seguras si no se ha identificado el usuario.
Aca lo explico un poco:
Primero veo los datos ingresados en el formulario de ingreso y veo que el usuario exista.

Codifica.php
Código PHP:

<? include("conex.php");
$login=$_POST['login'];$password=$_POST['password'];
$consultar=mysql_query("select * from usuarios where rut_user='".$login."' and pass='".$password."'");
if (
mysql_num_rows($consultar)==1)
    { 
    
session_start();
    
$_SESSION['id']=session_id();
    
$_SESSION['login']=$login;
    
$_SESSION['password']=$password;
    
$_SESSION['autentificado']="si";
    
$_SESSION['tipo']=mysql_result($consultar,0,"tipo_user");
    
header("Location: ../index2.php");
}
else
  {
   
header("Location: ../ingresar.php?error=si");
   exit();
?>
ya tengo mi sesion creada y aca esta el archivo que genera php para guardar la sesion
Código PHP:
id|s:32:"e3ffcb83d80bb99545287d813198bf24";
login|s:5:"admin";password|s:5:"admin";
autentificado|s:2:"si";tipo|s:1:"1"
Ahora bien, a cada pagina segura le agrego
Código PHP:
include ("seguridad.php"); 
y aca esta el archivo
seguridad.php
Código PHP:
<?
session_start
();
if(
$_SESSION['autentificado']!="si")

    
header("Location: ingresar.php?error=si");
    exit();
}
?>
Hasta ahora todo funciona correctamente.
Resulta que cree un archivo menu.php en donde se despliegan diferentes opciones dependiendo el tipo de usuario. Cuando creo la sesion tambien guardo su tipo_user.
menu.php
Código PHP:
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?

$tipo_user
$_SESSION['tipo'];
if(
$tipo_user=="")
    echo 
"esta vacio";
if (
$tipo_user=="1")
    echo 
"Es Adm";
if (
$tipo_user=="3")
    echo 
"Es soporte";
    
?>
<table width="15%" border="1">
  <tr>
    <td><a href="form_usuarios.php" target="principal">Ingresar Usuarios</a></td>
  </tr>
  <tr>
    <td>Opcion 2</td>
  </tr>
  <tr>
    <td>Opcion 3</td>
  </tr>
  <tr>
    <td><a href="salir.php">Salir</a></td>
  </tr>
</table>
</body>
</html>
pero resulta que no logro recuperar el valor que tiene la sesion en el campo "tipo". Lo he hecho traspasando el valor de $_SESSION['tipo'] a una variable $tipo_user pero tampoco muestra nada, siempre me dice que el campo esta vacio.
No se si habra que modificar algo en el php.ini.
Uso Register_globals en off, tengo el php como modulo de apache.
Ojala se entienda bien y me puedan ayudar.
Gracias
Salu2 !!!
__________________
AK.T.I.V.E.tm Live, Never DIE
  #19 (permalink)  
Antiguo 21/02/2004, 13:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si dices que tu varaible de sesión no tiene valor pero si que existe .. preguntate entonces si en la consulta SQL que haces obtienes el valor esperado ..

Para eso .. haz un simple "echo" a tu
Código PHP:
echo mysql_result($consultar,0,"tipo_user"); 
Y observa si ahí obtienes el valor esperado ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #20 (permalink)  
Antiguo 25/02/2004, 18:26
 
Fecha de Ingreso: julio-2002
Ubicación: Rancagua - Chile
Mensajes: 494
Antigüedad: 15 años, 5 meses
Puntos: 0
le agregue un session_start() y funciono.
Pero mejor le deje el include("includes/seguridad.php"); que ya tiene un session_start(), y de esa forma funciona bien

espero no estar haciendo nada malo

Gracias y Salu2 !!!
__________________
AK.T.I.V.E.tm Live, Never DIE
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 08:46.