Подтвердить что ты не робот

Можем ли мы установить cookie в php в зависимости от времени клиента?

У меня следующие требования:

  • создать файл cookie для домена сервера
  • что cookie истечет через x секунд, скажем, через 200 или 500 секунд.

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Если 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);
}