2012-01-30 1 views
13

I имеют следующие требования:Можем ли мы установить cookie в php в зависимости от времени клиента?

  1. создать куки для домена сервера
  2. , что печенье истекает через секунд говорят в 200 или 500 секунд.

Проблема заключается в том, что клиенты могут отставать на столько же минут, что и сервер. На стороне сервера я устанавливаю печенье, как

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

но теперь, если клиентский компьютер 500 секунд позади сервера, приведенные выше код будет влиять на кук, который истекает в 1000 не секундах 500 секунд.

Я думал отправить штамп времени клиента на сервер и установить в это время файл cookie. что-то вроде этого:

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

Но если клиент находится в 500 секунд позади, и если установить такой куки, который задним числом он не получает набор. Как добиться временной синхронизации между клиентом и сервером в случае истечения срока действия cookie?

+0

Это действительно отличный вопрос. Вы можете создать JavaScript для этого, это точно. Но я довольно уверен, что вы не можете сделать это только на PHP. –

+1

@ Возможно, если вы установите часовой пояс для часового пояса клиента? – Mike

+1

Это не гарантирует, что время будет идентичным времени пользователя. Только JavaScript может знать это (или он может передать его в форме, но не рассчитывать на него, если он критический). –

ответ

10

К сожалению, Истекает является абсолютной датой и зависит от местной даты пользовательского агента. Как вы сделали правильно, это может привести к неточному истечению срока действия cookie.

Это также является причина того, почему первый стандартизация IETF по Netscape’s original proposal, заменила абсолютную дату истечения по относительной дате истечения срока, то Max-Age атрибут, который указан время в дельте секундах от момента времени, печенье уже было выпущен. RFC 2965, который устарел RFC 2109, сделал то же самое. Точно так же, как RFC 6265, это в настоящее время самая последняя спецификация для файлов cookie.

Cookies как в RFC 6265 действительно также позволяет указать дату истечения срока действия оба относительной датой с использованием Max-Age и а абсолютная дата использованием Истекают, последние в первой очереди для обеспечения обратной совместимости:

Если файл cookie имеет атрибут Max-Age и Expires, атрибут Max-Age имеет приоритет и контролирует дату истечения срока действия файла cookie.

Таким образом, вы могли бы написать свою собственную функцию, которая имитирует это поведение:

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

Вот пример функции:

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

Правильный - атрибут 'Max-Age' является правильным способом достижения этого. – WildlyInaccurate

+0

Если вы пишете свою собственную функцию cookie, не используйте для этого имя и значение для 'rawurlencode'. – mcrumley

+0

спасибо, я попробую ваше предложение в ближайшее время. – Shades88

Смежные вопросы