Ver Mensaje Individual
  #10 (permalink)  
Antiguo 16/10/2007, 15:33
mhatter
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 17 años, 2 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Cita:
Iniciado por ThunderFx Ver Mensaje
brother, agradezco realmente el interes que tienes en ayudarme, muchas gracias...
Ni lo menciones :). Para mí es un gusto ayudar en lo que pueda, y ya que has hecho un esfuerzo por hacerte entender y publicar el código que tienes, no puedo hacer menos que corresponder echando un vistazo a ver qué pistas nuevas encontramos.

Bueno, respecto al problema, empiezo a sospechar que se trata de un efecto secundario del flujo de código en ciertos escenarios. Es decir, cada componente de tu aplicación (security.php, inicio.php, etc.) puede lucir correcto por separado, pero al mezclarlos y seguir el hilo de ejecución (por ejemplo, cuando el usuario visita una URL de la forma categorias/([^/]+)/([^/]+)/([^/]+)), probablemente hay llamados a setcookie() que sobrescriben valores previos, y el comportamiento empieza a ser un poco difícil de determinar ya que hay una mezcla de cosas que afectan el resultado final (valores de ruta de cookies y el comportamiento del navegador si recibe más de una cabecera 'Set-Cookie' para un mismo valor).

Me parece que encontrar la fuente del problema no sería difícil, pero necesitaría ver el código de toda la aplicación, porque hasta ahora veo que hay cosas que no has publicado y que son importantes. Por ejemplo, el código en security.php refresca el tiempo de expiración de las cookies si ya existen, pero en alguna parte deben definirse las cookies por primera vez (supongo que en login.php). También, ese archivo salir.php que has mostrado, ¿desde dónde es incluído?

Bueno, habiendo dicho todo esto, hay un par de cosas sobre las que podría darte sugerencias de lo que has mostrado en tu último mensaje:

1. En security.php tienes esta línea:

Código PHP:
$result mysql_query("SELECT * FROM usuarios WHERE usuario='".$HTTP_COOKIE_VARS["Nick"]."' AND contrasena='".$HTTP_COOKIE_VARS["Pass"]."'"); 
Nota que este código es vulnerable al tipo de ataques conocidos como "inyección SQL". para evitar ese tipo de problemas, básicamente asegúrate de validar siempre la entrada que te venga desde afuera (p.ej. $_GET, $_POST, $_COOKIE, etc.).

Te sugiero esta alternativa:

Código PHP:
$sql sprintf ("SELECT * FROM usuarios WHERE usuario='%s'
                 AND contrasena='%s'"
,
                 
mysql_real_escape_string ($_COOKIE['Nick']),
                 
mysql_real_escape_string ($_COOKIE['Pass']));

$result mysql_query($sql); 
2. En este segmento de código:

Código PHP:
    setcookie("Nick","x",time()-3600,'/');
    
setcookie("Pass","x",time()-3600,'/');

    
$newu $HTTP_COOKIE_VARS["Nick"];
    
$newp $HTTP_COOKIE_VARS["Pass"];

    echo 
"newu: $newu  newp: $newp"
Parece que esperaras ver que el valor en $HTTP_COOKIE_VARS["Nick"] cambiara después de llamar a setcookie(), pero ese no es el caso. La función setcookie() no define automáticamente nada en la matriz $HTTP_COOKIE_VARS (o $_COOKIE), éstas matrices se llenan cuando se hace una petición de página, es decir, tendrías que esperar hasta la próxima petición del usuario para ver que en efecto $HTTP_COOKIE_VARS["Nick"] cambió su valor.

Si en realidad necesitas actualizar inmediatamente el valor de $HTTP_COOKIE_VARS, hazlo manualmente:

Código PHP:
// Borrar cookies
setcookie("Nick","x",time()-3600,'/');
setcookie("Pass","x",time()-3600,'/');

unset(
$HTTP_COOKIE_VARS['Nick']);
unset(
$HTTP_COOKIE_VARS['Pass']); 

Finalmente, recuerda limpiar las cookies en tu navegador cada vez que vayas a probar un nuevo cambio en tu código, ya que puede darse el caso de que corrijas todos los problemas, tu código esté perfecto, pero sigas viendo comportamiento extraño debido a cookies viejas :).