2012-01-30 12 views
13

ho seguenti requisiti:Possiamo impostare un cookie in php in base all'ora del cliente?

  1. creare un cookie per il dominio del server
  2. il cookie scadrà dopo x secondi dicono in 200 o 500 secondi.

Il problema è che i client possono rimanere indietro di molti minuti dietro al server. Sul lato server io pongo cookie come

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

ma ora se il computer client è 500 secondi dietro di server, al di sopra del codice effettuerà in un cookie che scadrà nel 1000 non secondi a 500 secondi.

Stavo pensando di inviare il timestamp del client al server e impostare cookie in quel momento. qualcosa di simile:

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

Ma se il cliente è di 500 secondi di ritardo, e se ho impostato un tale biscotto che viene retrodatato non venga impostato. Come ottenere una sincronizzazione temporale tra client e server in caso di scadenza del cookie?

+0

Che in realtà è un'ottima domanda. È possibile generare il JavaScript per farlo, questo è sicuro. Ma sono abbastanza sicuro che non puoi farlo solo in PHP. –

+1

@Truth forse se si imposta il fuso orario sul fuso orario del client? – Mike

+1

Ciò non garantisce ancora che il tempo sarà identico al tempo dell'utente. Solo JavaScript può saperlo (o può passarlo in una forma, ma non contarci se è fondamentale). –

risposta

10

Sfortunatamente, Scadenza è una data assoluta e dipende dalla data locale dell'agente utente. Come hai concluso correttamente, questo potrebbe portare a una scadenza imprecisa del cookie.

Questo è anche il motivo per cui prima di standardizzazione IETF di Netscape’s original proposal, ha sostituito la data di scadenza assoluta da una data di scadenza relativa, il Max-Age attributo che specifica il tempo in secondi delta dal punto nel tempo il cookie è stato rilasciato. RFC 2965, quella RFC 2109 obsoleta, ha fatto lo stesso. Proprio come RFC 6265, che è attualmente la specifica più recente per i cookie.

Cookies come da RFC 6265, inoltre, consentono di specificare la data di scadenza sia da una data relativa utilizzando Max-Age e una data assoluta utilizzando Scade, quest'ultimo soprattutto per la compatibilità all'indietro:

Se un cookie ha l'attributo Max-Age e Expires, l'attributo Max-Age ha la precedenza e controlla la data di scadenza del cookie.

Così si potrebbe scrivere la propria funzione che simula questo comportamento:

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

Ecco un esempio di funzione:

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

Corretto: l'attributo 'Max-Age' è il modo corretto per ottenere ciò. – WildlyInaccurate

+0

Se scrivi la tua funzione cookie, non per ottenere 'rawurlencode' il nome e il valore. – mcrumley

+0

grazie, proverò presto il tuo suggerimento. – Shades88

Problemi correlati