Foros del Web » Programando para Internet » PHP »

Problema de sesion session_name() y session_regenerate_id()

Estas en el tema de Problema de sesion session_name() y session_regenerate_id() en el foro de PHP en Foros del Web. Buenos días y gracias de antemano. Mi problema es el siguiente: Tengo una web que hasta hace poco funcionaba en el servidor bien, ahora no ...
  #1 (permalink)  
Antiguo 18/01/2012, 05:53
Avatar de idmamen  
Fecha de Ingreso: mayo-2011
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Pregunta Problema de sesion session_name() y session_regenerate_id()

Buenos días y gracias de antemano.
Mi problema es el siguiente:
Tengo una web que hasta hace poco funcionaba en el servidor bien, ahora no lo hace, sin embargo en mi ordenador va perfectamente.

Bueno paso a describir el problema:

Para acceder a una zona privada inicio un archivo que verifica el usuario y la contraseña....

y en caso de que sea correcto accedo a otro archivo que guarda ciertos datos en la base de datos para control y estadísticas...

bueno, pues bien, en el primer archivo inicio la sesión de la siguiente forma

<?php
session_name("gce");
session_start();
....
?>
sigo con el código y dentro del body, si he confirmado que el usuario y la contraseña son correctos cambio el nombre de sesión y genero un nuevo id:

session_name("gcepriv");
session_regenerate_id();


pues bién mal....

session_name me cambia el nombre....
session_regenerate_id me devuelve null.... ni true ni false

pero, aunque no regenere el id, el nombre me lo cambia.... al pasar al siguiente archivo inicio con el nuevo nombre de sesión

<?php
session_name("gcepriv");
session_start();
....
?>

pues ahora el nombre de sesión me lo conserva pero el id me lo cambia, por lo tanto no pasa las variables de sesion $_SESSION[""]

En mi ordenador como servidor funciona, en otro ordenador con servidor funciona, pero en el sitio web donde está alojada la página ha dejado de funcionar....

¿...?

¿Alguna solución?....
¿Sabéis porqué puede pasar esto?
...

Llevo una semana buscando y no doy con la tecla....

Gracias de nuevo. y un feliz año nuevo para todos.
  #2 (permalink)  
Antiguo 18/01/2012, 09:41
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 2 meses
Puntos: 188
Respuesta: Problema de sesion session_name() y session_regenerate_id()

Si funciona en 2 servidores de manera remota (No local!!) y en un servidor remotamente no funciona entonces el problema es del servidor.

Podría ser debido a una configuración de dicho servidor.

======================================>

Si en cambio, solo has probado localmente y funciona, bien podría ser un error de programación por lo cual funciona de forma local pero no de forma remota.

Dificil determinar el problema sin ver código.
  #3 (permalink)  
Antiguo 18/01/2012, 10:48
Avatar de idmamen  
Fecha de Ingreso: mayo-2011
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Pregunta Respuesta: Problema de sesion session_name() y session_regenerate_id()

Gracias por tu respuesta.

Eso es lo que yo había pensado, que es un problema de configuración del servidor, pero no encuentro a que puede ser debido.

El código es lo que he puesto, no tiene más historia, ya que lo demás es tema de control de acceso, no obstante lo pongo por si sirve de algo, ahí va:

Primer archivo acceso:

<?php
session_cache_limiter('nocache,private');
session_name("gce");
session_start();
$_SESSION['us']="lector";
$_SESSION['cl']="661019roctel";
$_SESSION['pr']="C";
$cod_pais = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
if (isset($_GET['idm'])) {
$cod_pais=$_GET["idm"];
}
if ($cod_pais=="es"){
$titulo="ZONA PRIVADA";
$mensaje_contra="Comprobando contraseña.";
$mensaje_user="Comprobando usuario.";
$mensaje_fin="Usuario y contraseña correctos.";
$mensaje_fallo="Acceso denegado, los datos no son correctos, vuelva a intentarlo.";
$mensaje_fallo_pt="En su ordenador o su red hay una sesión abierta de otro usuario. \nCierre la sesión anterior antes de abrir una nueva o vuelva a intentarlo.";
$mensajeconfirmary="ATENCIÓN. Existe una sesión abierta en este ordenador. La sesión anterior se Cerrará.";
$mensajeconfirmarz="ATENCIÓN. Existe una sesión abierta en otro ordenador. La sesión anterior se Cerrará.";
}else{
$titulo="ZONE PRIVÉE";
$mensaje_contra="Vérification de mot de passe.";
$mensaje_user="Vérification de l&prime;utilisateur.";
$mensaje_fin="Signaler un nom d&prime;utilisateur et mot de passe.";
$mensaje_fallo="L&prime;accès est refusé, les détails sont incorrects, s&prime;il vous plaît essayer à nouveau.";
$mensaje_fallo_pt="Dans son ordinateur ou son réseau il y a une session ouverte d'un autre utilisateur. \nIl ferme la session précédente avant d'ouvrir un nouvelle ou s&prime;il vous plaît essayer à nouveau.";
$mensajeconfirmary="ATTENTION. Il existe une session ouverte dans cet ordinateur. La session précédente Sera fermée.";
$mensajeconfirmarz="ATTENTION. Il existe une session ouverte dans un autre ordinateur. La session précédente Sera fermée.";
}


?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="expired" content="01-Mar-10 00:00:01 GMT" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GROUPE COULEUR ESPAGNOL (PRIVEE)</title>
<script language="JavaScript">
<!--
var idm
idm='<?php echo $cod_pais; ?>';
// -->
</script>
</head>
<body>

<?php
include_once("Scripts/codigo.php");
// 1 - inicio
if (isset($_POST["usuario"])){
echo $mensaje_user."<br />";
$user=trim($_POST["usuario"]);
if (isset($_POST["contra"])){
echo $mensaje_contra."<br />";
$contra=trim($_POST["contra"]);

if($user==""){
echo $mensaje_fallo." - Errno: USR002. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}elseif(empty($user)){
echo $mensaje_fallo." - Errno: USR003. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}elseif($contra==""){
echo $mensaje_fallo." - Errno: CTR002. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}elseif(empty($contra)){
echo $mensaje_fallo." - Errno: CTR003. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}else{
$con = mysql_connect("localhost:3306",$_SESSION['us'],$_SESSION['cl'])
or die("No se ha podido establecer la conexion con el servidor!");

$resp = mysql_select_db("GCE")
or die("No se ha podido seleccionar la base de datos");

$sqlquery = "SELECT * FROM usuarios WHERE usuario='".$user."'";
$queryresult = mysql_query($sqlquery) or die ("Entre nombre de usuario correcto.");

if(mysql_num_rows($queryresult)>0){
$row=mysql_fetch_array($queryresult);

if(strcmp($row["usuario"],$user)==0 and strcmp($row["contras"],$contra)==0) {
desactivarpasados();
$ipremoto=$_SERVER['REMOTE_ADDR'];
$sqlqueryses = "SELECT * FROM sesiones WHERE ipremoto='".$ipremoto."' AND activo='si' AND usuario!='".$user."'";
$queryresultses = mysql_query($sqlqueryses);

if(mysql_num_rows($queryresultses)<=0){
$rowses=mysql_fetch_array($queryresultses);

// asigno los valores nuevos a las variables

echo session_id()."<br />";
//aquí miro el valor de id en servidor local x - en servidor remoto x

echo session_name()."<br />";
//aquí miro el valor del nombre de sesión en servidor local "gce" - en servidor remoto "gce"
y renombro la sesión


session_name("gcepriv");

$bien=session_regenerate_id();

$_SESSION["usr"]=$user;
$_SESSION["clr"]=$contra;
$_SESSION["prr"]=$row["permiso"];
$_SESSION["nomr"]=$row["nombre"];
$idse=new encripta();
$ids=$idse->encadena(session_id());

echo session_id()."<br />";
//aquí compruebo de nuevo el valor de id en servidor local en este caso cambia - en servidor remoto el mismo x
echo session_name()."<br />";
//aquí compruebo de nuevo el valor del nombre de sesión en servidor local y es "gcepriv" - en servidor remoto "gcepriv"

if ($bien==NULL){
echo "- NULO -";
}elseif($bien==true){
echo "- Verdadero -";
}elseif ($bien==false){
echo "- Falso -";
}else{
echo "Algo pasa";
}


?>
<script language="javascript">
<!--

function redirige(ids,confirmado){
window.location.href="accederesses.php?ids=" + ids + "&idm=" + idm + "&confirm=" + confirmado
}
function confirmar(mensaje,ids){
if(confirm(" " + mensaje + " ")){
window.location.href="accederesses.php?ids=" + ids + "&idm=" + idm + "&confirm=si"
}else{
window.location.href="accesoes.php?idm=" + idm
}
}
-->
</script>
<?php

$permiso=$_SESSION["prr"];
$fecha=getdate();
$fechacero=$fecha[0];
$sqlquery = "SELECT * FROM usuarios WHERE grupo='generico' AND permiso='".$permiso."'";
$queryresult = mysql_query($sqlquery) or die ("Entre nombre de usuario correcto.");

if(mysql_num_rows($queryresult)>0){
$row=mysql_fetch_array($queryresult);

if(strcmp($row["grupo"],"generico")==0 and strcmp($row["permiso"],$permiso)==0) {
$_SESSION["us"]=$row["usuario"];
$_SESSION["cl"]=$row["contras"];
$_SESSION["pr"]=$row["permiso"];

$sqlqueryses = "SELECT * FROM sesiones WHERE activo='si' AND usuario='".$_SESSION['usr']."' AND contras='".$_SESSION['clr']."'";
$queryresultses = mysql_query($sqlqueryses);
$rowses=mysql_fetch_array($queryresultses);

if (mysql_num_rows($queryresultses)>0){
if (($fechacero-$rowses["idcero"])<3600){
if ($rowses["ipremoto"]==$_SERVER['REMOTE_ADDR']){
$_SESSION["idsesion"]=$rowses["idsesion"];
//echo "idsesion: ".$_SESSION["idsesion"]."<br />";
echo "<script name='accion'>confirmar('".$mensajeconfirmary."',' ".$ids."')</script>";

}else if($rowses["ipremoto"]!=$_SERVER['REMOTE_ADDR']){
$_SESSION["idsesion"]=$rowses["idsesion"];
//echo "idsesion: ".$_SESSION["idsesion"]."<br />";
echo "<script name='accion'>confirmar('".$mensajeconfirmarz."',' ".$ids."')</script>";
} //mysql_close();
}else{
$_SESSION["idsesion"]=$rowses["idsesion"];
echo "<script name='accion'>redirige('".$ids."','si')</script>";
}
}else{
$_SESSION["idsesion"]="";
echo "<script name='accion'>redirige('".$ids."','nohf')</script>";
}
}else{
session_unset();
echo $mensaje_fallo." - Errno: PRBD002. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}
}else{
session_unset();
echo $mensaje_fallo." - Errno: PT001. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";

}

}else{
session_unset();
echo $mensaje_fallo_pt." - Errno: PT001. <br />";
echo "<meta http-equiv='refresh' content='4;URL=accesoes.php?idm=".$cod_pais."'>";
}
}else{
session_unset();
echo $mensaje_fallo." - Errno: UCBD001. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}
}else{
echo $mensaje_fallo." - Errno: USRBD001. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}
}
----->
  #4 (permalink)  
Antiguo 18/01/2012, 10:49
Avatar de idmamen  
Fecha de Ingreso: mayo-2011
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Problema de sesion session_name() y session_regenerate_id()

<-----

}else{
echo $mensaje_fallo." - Errno: CTR001. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}

}else{
echo $mensaje_fallo." - Errno: USR001. <br />";
echo "<meta http-equiv='refresh' content='2;URL=accesoes.php?idm=".$cod_pais."'>";
}


?>

</body>
</html>


bien y el que accedo desde este control de acceso:



<?php
session_cache_limiter('nocache,private');
session_name("gcepriv");
session_start();
if (!isset($_SESSION['us'])){
$_SESSION['us']="lector";
$_SESSION['cl']="661019roctel";
$_SESSION['pr']="C";
}
$cod_pais = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
if (isset($_GET['idm'])) {
$cod_pais=$_GET["idm"];
}
if ($cod_pais=="es"){
$titulo="ZONA PRIVADA";
$mensaje_contra="Comprobando contraseña.";
$mensaje_user="Comprobando usuario.";
$mensaje_fin="Usuario y contraseña correctos.";
$mensaje_fallo="Acceso denegado, los datos no son correctos, vuelva a intentarlo.";
$alerta="ATENCIÓN. Existe una sesión abierta. La sesión anterior se Cerrará.";
}else{
$titulo="ZONE PRIVÉE";
$mensaje_contra="Vérification de mot de passe.";
$mensaje_user="Vérification de l'utilisateur.";
$mensaje_fin="Signaler un nom d&prime;utilisateur et mot de passe.";
$mensaje_fallo="L'accès est refusé, les détails sont incorrects, s'il vous plaît essayer Ã* nouveau.";
$alerta="AVERTISSEMENT. Il ya une session ouverte. La session précédente de fermer.";
}


?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
<META HTTP-EQUIV="expired" CONTENT="01-Mar-10 00:00:01 GMT" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GROUPE COULEUR ESPAGNOL (PRIVEE)</title>

<script LANGUAGE="JavaScript">
<!--
function redirige(url){
parent.location.href=url
}
var ids
var conf
var idm
idm='<?php echo $cod_pais; ?>';

// -->
</script>


</head>
<body>

<?php
echo "<script name='accion'>alert('Sesion: ".session_id()." Name: ".session_name().".')</script>";

Aquí miro el id y en en local es el mismo asignado con session_regenerate_id - en remoto es otro distinto.

- Tanto si regenero o no el id en el anterior aquí me lo cambia.

El nombre de sesión es el nuevo que le he dado "gcepriv" en ambos casos (claro que arriba se lo vuelvo a asignar es de lógica que sea éste.

Por tanto en el servidor remoto las variables $_SESSION están vacías.



echo "Variable usuario: ".$_SESSION["usr"]." <br />";


include_once("Scripts/codigo.php");
// 1 - inicio
if (isset($_GET["ids"])){

$ids=$_GET["ids"];

?>
<SCRIPT LANGUAGE="JavaScript">
<!--
ids='<?php echo $ids; ?>';
// -->
</script>
<?php


if (isset($_SESSION["usr"])){
if (isset($_GET["confirm"])){
$confirm=$_GET["confirm"];
//echo "<script lenguaje='javascript'>conf='".$confirm."'<..script >";
}else{
$confirm="nhf";
}
if ($confirm=="no"){
session_unset();
//echo "<script name='accion'>alert('No ha confirmado cerrar la sesión abierta, vuelve a la página de inicio.')<..script>";
echo "<meta http-equiv='refresh' content='1;URL=accesoes.php?idm=".$cod_pais."'>";
}else{

if($confirm=="si"){
//echo "<script name='accion'>alert('Ha confirmado cerrar la sesión abierta.')<..script>";
$pag['usr']=$_SESSION["usr"];
$pag['clr']=$_SESSION["clr"];
$pag['prr']=$_SESSION["prr"];
$pag['pag']="accederes.php";
$pag['sidsesion']="";
$pag['idsesion']=$_SESSION["idsesion"];
controldeacceso($pag,$cod_pais,"cierro");
}
$pag['usr']=$_SESSION["usr"];
$pag['clr']=$_SESSION["clr"];
$pag['prr']=$_SESSION["prr"];
$pag['pag']="privevisado.php";
$pag['sidsesion']=session_id();
$pag['idsesion']="";
controldeacceso($pag,$cod_pais,"iniciosesion");

if($_SESSION['prr']=="A"){

echo $mensaje_fin."<br />";
?>
<script language="javascript">
<!--

redirige("zprivada/privevisado.php?ids=" + ids + "&idm=" + idm);
-->
</script>
<?php
//redirigir('visadoes.php?idm='.$cod_pais);
//echo "<meta http-equiv='refresh' target='_parent' content='2;URL=visadoes.php?idm=".$cod_pais."'>";

}elseif($_SESSION['prr']=="B"){
//$nuevo=new encripta();
echo $mensaje_fin."<br />";
//echo "Sesion: ".session_id()."<br />";
//echo "Ids: ".$ids."<br />";
//echo "Ids descode: ".$nuevo->descadena($ids)." <br />";
//echo "<script name='accion'>alert('Me paro aquÃ* B')<..script>";
?>
<script language="javascript">
<!--

redirige('zprivada/privevisado.php?ids=' + ids + '&idm=' + idm);
-->
</script>
<?php
//echo "<meta http-equiv='refresh' target='_parent' content='2;URL=privegrup.php?idm=".$cod_pais."'>";

}elseif($_SESSION['prr']=="T" or $_SESSION['prr']=="X"){

echo $mensaje_fin."<br />";
?>
<script language="javascript">
<!--

redirige('zprivada/privevisado.php?ids=' + ids + '&idm=' + idm);
-->
</script>
<?php

}else{

echo $mensaje_fallo." - Errno: PR001. <br />";
echo "<meta http-equiv='refresh' content='12;URL=accesoes.php?idm=".$cod_pais."'>";
}
}
}else{

echo $mensaje_fallo." - Errno: USR004. <br />";
echo "<meta http-equiv='refresh' content='12;URL=accesoes.php?idm=".$cod_pais."'>";
}

}else{
echo "<script name='accion'>alert('La identificación de sesión no existe. Errno: SEG001.')</script>";
}

?>

</body>
</html>


Ahora, si es un tema de configuración ¿que directivas son las que pueden afectar a esta función? ¿y es un tema de apache o de php?...

Gracias de nuevo.
  #5 (permalink)  
Antiguo 18/01/2012, 11:45
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 2 meses
Puntos: 188
Respuesta: Problema de sesion session_name() y session_regenerate_id()

Ah ya. Bueno lo que pasa es que cuando das un nombre a session_name, este devuelve el antiguo y se reinicia con el valor nuevo.

Esto debe de suceder antes de un session_start

Por lo que hay que destruir la sesión antes de renombrar un session_name y después volver a iniciar la sesión.

Un saludo

P.D: Esto no funciona en el servidor por algo referente a la configuración del servidor (httpd.conf) o del PHP (php.ini). Yo no tengo la suficiente experiencia en esto por lo cual no tengo idea de cual podría ser esta configuración.

P.D2:
  #6 (permalink)  
Antiguo 18/01/2012, 13:54
Avatar de idmamen  
Fecha de Ingreso: mayo-2011
Mensajes: 24
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Problema de sesion session_name() y session_regenerate_id()

Muchas gracias.

Seguiré buscando a ver si doy con el tema, el caso es que antes funcionaba en el servidor remoto y de pronto dejó de funcionar ¿...?

Un Beso y si alguien sabe algo .... a ver si puedo solucionarlo.

Etiquetas: variables, usuarios
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 22:01.