Foros del Web » Programando para Internet » PHP »

De cookies a PHPSESSID

Estas en el tema de De cookies a PHPSESSID en el foro de PHP en Foros del Web. Hola amigos, Estoy pasando todo el control de sesiones para que funcione independientemente de que el usuario en su navegador tenga deshabilitadas las cookies. El ...
  #1 (permalink)  
Antiguo 20/01/2004, 07:39
 
Fecha de Ingreso: mayo-2003
Mensajes: 125
Antigüedad: 20 años, 11 meses
Puntos: 0
De cookies a PHPSESSID

Hola amigos,

Estoy pasando todo el control de sesiones para que funcione independientemente de que el usuario en su navegador tenga deshabilitadas las cookies.

El código es bastante simple:

Hago un control de usuario y contraseña:

Código PHP:
<?
if ($_POST["login"]!=""$login $_POST["login"];
 else 
$login $_GET["login"];
if (
$_POST["password"]!=""$password md5($_POST["password"]);
 else 
$password md5($_GET["password"]);

//Conexión con la BD
include("./includes/conexionbd.php");
//Sentencia SQL para obtener datos sobre el usuario
$sSQL="SELECT password, perfil_pv FROM acceso WHERE usuario='" $login "' AND password='" $password "'";
$result=mysql_db_query($bd,$sSQL);
//Obtención del perfil del usuario
$row=mysql_fetch_array($result);
$pfl=$row["perfil_pv"]; 

if(
mysql_num_rows($result)!=0)
{
 
session_name(); 
 
session_start(); 
 
session_register("bien");
 
session_encode();
 
$url "Location: default.php?pfl=".$pfl."&PHPSESSID=".$PHPSESSID;
 
header($url);
}else{ 
 
//si no existe le mando otra vez al inicio
 
header("Location: index_err.php");
}
?>
En la pagina destino tengo como include el siguiente codigo:

Código PHP:
<?
<?
//Inicio la sesión
session_name();
session_start("bien");
//Comprobación de autentificación
if (!(session_is_registered("bien")))
{
    
session_destroy();
    
header("Location:index.php");
    exit();
}
?>
Y me pasa algo curioso, ya que deberia funcionar incluso bloqueando todas las cookies. Si le pongo en el navegador hasta proteccion de privacidad alta funciona a las mil maravillas pero si le pongo "bloquear todas las cookies" me muestra:

Código PHP:
Warningsession_start() [function.session-start]: The session id contains illegal charactersvalid characters are only a-zA-and 0-9 in /home/html/back_pv/includes/seguridad.php on line 4

Warning
session_start() [function.session-start]: Cannot send session cache limiter headers already sent (output started at /home/html/back_pv/includes/seguridad.php:4in /home/html/back_pv/includes/seguridad.php on line 4

Warning
session_destroy() [function.session-destroy]: Session object destruction failed in /home/html/back_pv/includes/seguridad.php on line 7

Warning
Cannot modify header information headers already sent by (output started at /home/html/back_pv/includes/seguridad.php:4in /home/html/back_pv/includes/seguridad.php on line 8 
Me habla de caracteres invalidos cuando creo que no los tiene y tb del famoso "headers already sent" que aparece cuando tienes espacios en blanco.

Lo mas curioso del tema es que si estos dos problemas existierna realmente me los tendria que dar en cualqueir caso y no en este.

¿Alguna idea?

Muchas gracias amigos,
__________________
Lailuluelo
El error está en lo obvio
  #2 (permalink)  
Antiguo 20/01/2004, 10:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Tienese un enorme lio de uso de las funciones de sesiones ...

Con sesion_name() determinas o lees el nombre de la sesión actual ..

Con sesion_start() continuas o creas una nueva sesión bajo el SID (Identifiador único de sesión). Se continua la sesión activa si a ese script php que inicia la sesión se le llega un SID válido .. ya sea propagado por el URL o cookies.

Escribir sessión:
Código PHP:
<?
session_name
("nombre_de_mi_sesion");
session_start();
// registro de tus variables de sesión ..
?>
leer sesión:
Código PHP:
<?
session_name
("nombre_de_mi_sesion");  // el mismo que inciastes ..
session_start();
// lees tu sesión variable
?>
El SID (nombre de sesión+ID sesión) lo puedes obtener de la constante de nombre: SID o bien formandolo con las funciones session_name() y session_id()

A su vez .. puedes propagar el SID de forma automática (PHP reescribirá la mayoría de tag HTML para adjuntar ese SID en los links, formularios . .etc) o bien lo puedes hacer tu manualmente como así pretendias.

Código PHP:
echo "<a href="nose.php?".SID.">"; 
ó

Código PHP:
echo "<a href="nose.php?".session_name()."=".session_id().">"; 
El "PHPSESSID" es el nombre por defecto que le dá PHP a las sesiones si no usas (defines) session_name("un nombre") .. Pero si lo usas; es decir, lo cambias .. debes de usarlo (el mismo) en cada script que use esa sesión bajo ese nombre.

Por lo demás .. te recomiendo que NOOOO uses session_register() y uses los arrays superglobales $_SESSION (PHP versión 4.1.0 en adelante) para trabajar con sesiones. (en una de las primeras FAQ's de este foro hay un pequeño ejemplo de uso) .. lo demás lo tienes en:

www.php.net/session

Un saludo,




Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 21/01/2004, 04:04
 
Fecha de Ingreso: mayo-2003
Mensajes: 125
Antigüedad: 20 años, 11 meses
Puntos: 0
SOLUCIONADO

Hola,

Muchas gracias Cluster.

A continuación os muestro el codigo funcionando para utilizar sesiones independientemente de que se admitan cookies o no.

Aqui se hace el control de los datos suministrados por el usuario y si son correctos se abre sesión y se le da valor a una variable.

Código PHP:
<?
if ($_POST["login"]!=""$login $_POST["login"];
 else 
$login $_GET["login"];
if (
$_POST["password"]!=""$password md5($_POST["password"]);
 else 
$password md5($_GET["password"]);

//Conexión con la BD
include("./includes/conexionbd.php");
//Sentencia SQL para obtener datos sobre el usuario
$sSQL="SELECT password FROM acceso WHERE usuario='" $login "' AND password='" $password "'";
$result=mysql_db_query($bd,$sSQL);
//Obtención del perfil del usuario
$row=mysql_fetch_array($result);

if(
mysql_num_rows($result)!=0)
{
 
session_name("misesion"); 
 
session_start(); 
 
$_SESSION['admitido'] = "SI";
 
session_encode();
 
$url "Location: default.php?pfl=".$SID;
 
header($url);
}else{ 
 
//si no existe le mando otra vez al inicio
 
header("Location: index_err.php");
}
?>
Y este es un pequeño include que está referenciado al principio de todas las páginas.

Código PHP:
<?
//Inicio la sesión
session_name("misesion");
session_start();
//Comprobación de autentificación
if (isset($_SESSION['admitido'])) {
  
session_destroy();
  
header("Location:index.php");
  exit();
}
?>
Un saludo y muchas gracias por todo,

__________________
Lailuluelo
El error está en lo obvio
  #4 (permalink)  
Antiguo 21/01/2004, 06:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
$SID como lo estás usando NO es la constante que te hacia mención .. Una constante en PHP va sin $ delante.

La constante SID te entrega:
nombre_sesion=ID_Sesion

(lo mismo que obtenerlo usando las funciones session_name() y session_id() como te indiqué).

El sistema te funciona por qué tal vez estas usando (si es que ves el SID en el URL):

session.use_trans_sid = 1 .. lo cual fuerza a PHP a que reescriba tag HTML como el de link (<a href ...>) y algunos más (lo define la directiva: allow_url_tag o algo así .. en tu php.ini).

Y en concreto .. por el redireccionamiento que haces es problale que uses:

session.use_cookies = 1

Para que PHP no use cookies para propagar el SID y sólo use la anterior (que reescriba los tag mencionados para insertar el SID) .. debes usar:

session.use_cookies = 0

En esos casos .. el SID sólo tendrías que propagarlo -manualmente- en redireccionamientos tipo header ("location: ....") .. o en redireccionamientos javascript o etiquetas <META..> de refresh. El resto de tag HTML comunes: links, formularios .. frames .. lo hace PHP por defecto si usas session.use_trans_sid = 1

Revisa tu configuración de php.ini (en un phpinfo() lo puedes ver). Las directivas mencionadas se pueden ajustar también en tiempo de ejecución usando la función ini_set() (en las FAQ's hay un ejemplo de uso).


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 23/01/2004, 02:55
 
Fecha de Ingreso: mayo-2003
Mensajes: 125
Antigüedad: 20 años, 11 meses
Puntos: 0
Cuanta razón tenias

Hola,

Estabas en lo cierto, muchas gracias por tu ayuda.

Código PHP:
 header ("Location: default.php?".SID.""); 
Un saludo a todos,
__________________
Lailuluelo
El error está en lo obvio
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

SíEste tema le ha gustado a 3 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 18:42.