2012-01-30 5 views
13

que tengo siguientes requisitos:¿Podemos establecer una cookie en php de acuerdo con la hora del cliente?

  1. creará una cookie de dominio del servidor
  2. esa cookie caducará en x segundos dicen en 200 o 500 segundos.

El problema es que los clientes pueden retrasarse tanto como muchos minutos detrás del servidor. En el lado del servidor me he fijado como galletas

setcookie($cooName,$cooVal,time()+500,"/"); 

pero ahora si el equipo cliente está a 500 segundos por detrás del servidor, por encima de código efectuará en una cookie que expirará en 1000 no segundos a 500 segundos.

Estaba pensando en enviar la marca de tiempo del cliente al servidor y configurar la cookie en ese momento. algo como esto:

setcookie($cooName,$cooVal,$_GET['clientTS']+500,"/"); 

Pero si el cliente es de 500 segundos por detrás, y si fijo una cookie de este tipo que se retroactivo no quede ajustado. ¿Cómo lograr una sincronización de tiempo entre el cliente y el servidor en caso de caducidad de cookies?

+0

que en realidad es una excelente pregunta. Puede generar el JavaScript para hacerlo, eso es seguro. Pero estoy bastante seguro de que no puedes hacerlo solo en PHP. –

+1

@Truth ¿tal vez si configura la zona horaria en la zona horaria del cliente? – Mike

+1

Eso aún no garantiza que el tiempo sea idéntico al tiempo del usuario. Solo JavaScript puede saberlo (o puede pasarlo en un formulario, pero no cuente con él si es crítico). –

Respuesta

10

Desafortunadamente, expira es una fecha absoluta y depende de la fecha local del agente de usuario. Como ha concluido correctamente, esto podría llevar a una caducidad inexacta de las cookies.

Ésta es también la razón por la primera estandarización de Netscape’s original proposal del IETF, sustituyó a la fecha de caducidad absoluta para una fecha de caducidad relativa, el Max-Edad atributo que especifica el tiempo en segundos delta desde el punto en el tiempo la cookie ha sido emitido. RFC 2965, ese RFC 2109 obsoleto, hizo lo mismo. Al igual que RFC 6265, esa es actualmente la especificación más reciente para las cookies.

cookies como por RFC 6265 no permiten también para especificar la fecha de caducidad por tanto una fecha relativa usando Max-Edad y una fecha absoluta usando Expira, este último principalmente para la compatibilidad hacia atrás:

Si una cookie tiene los atributos Max-Age y Expires, el atributo Max-Age tiene precedencia y controla la fecha de caducidad de la cookie.

Por lo que podría escribir su propia función que imita este comportamiento:

$maxage = 12345; 
$expires = date(DATE_COOKIE, time()+$maxage); 
header("Set-Cookie: $name=$value, Expires=$expires, Max-Age=$maxage, …"); 

He aquí un ejemplo de función:

function set_cookie($name, $value=null, $maxage=null, $path=null, $domain=null, $secure=false, $httponly=false) { 
    $cookie = rawurlencode($name) . '=' . rawurlencode($value); 
    $attributes = array(); 
    if (!is_null($maxage)) { 
     $maxage = intval($maxage); 
     $attributes[] = 'Expires='.date(DATE_COOKIE, $maxage > 0 ? time()+$maxage : 0); 
     $attributes[] = 'Max-Age='.$maxage; 
    } 
    if (!is_null($path)) { 
     $attributes[] = 'Path='.rawurlencode($path); 
    } 
    if (!is_null($domain)) { 
     $attributes[] = 'Domain='.rawurlencode($domain); 
    } 
    if ($secure) { 
     $attributes[] = 'Secure'; 
    } 
    if ($httponly) { 
     $attributes[] = 'HttpOnly'; 
    } 
    header('Set-Cookie: '.implode('; ', array_merge(array($cookie), $attributes)), false); 
} 
+0

Correcto: el atributo 'Max-Age' es la forma correcta de lograr esto. – WildlyInaccurate

+0

Si escribe su propia función de cookie, no lo haga para obtener 'rawurlencode' el nombre y el valor. – mcrumley

+0

gracias, voy a intentar su sugerencia pronto. – Shades88

Cuestiones relacionadas