Проверка строки даты rfc2616 с помощью PHP - PullRequest
2 голосов
/ 20 июня 2009

В целях безопасности для запросов к веб-сервису PHP потребуется заголовок Date:

Мне нужно вычислить, находится ли заголовок Date: в пределах 15 минут от часов компьютера. Я могу легко сделать это, сравнив

$dt = new DateTime($_SERVER['HTTP_DATE']);

к фактической дате. Однако strotime также поддерживает такие форматы, как «сейчас», которые всегда будут «действительными».

Есть ли простой способ убедиться, что люди указывают абсолютную дату. Строгая проверка RFC2616 еще лучше, но не является обязательным требованием.

См: http://www.ietf.org/rfc/rfc2616.txt раздел 3.3.1

Ответы [ 2 ]

4 голосов
/ 20 июня 2009

Сделал некоторые исследования, и похоже, что вы можете решить эту проблему, используя strptime () . Обратите внимание, что это не проверено, и я просто предполагаю, что strptime () будет правильно преобразовывать строку в GMT на основе предоставленного часового пояса. Это должно, по крайней мере, начать.

$in = $_SERVER['HTTP_DATE'];
$out = 0;

$strptime_patterns = array(
    // Matches: Sun, 06 Nov 1994 08:49:37 GMT
    '%a, %d %h %Y %H:%M:%S %z',
    '%a, %d %h %Y %H:%M:%S %Z',
    // Matches: Sunday, 06-Nov-94 08:49:37 GMT
    '%A, %d-%h-%y %H:%M:%S %z',
    '%A, %d-%h-%y %H:%M:%S %Z',
    // Matches: Sun Nov  6 08:49:37 1994
    '%a %h %e %H:%M:%S %Y'
);

foreach ($strptime_patterns as $pat) {
    if ($arr = strptime($in, $pat)) {
        $out = mktime($arr['tm_hour'], $arr['tm_min'], $arr['tm_sec'], $arr['tm_mon'], $arr['tm_mday'], $arr['tmp_year'] + 1900);
        break;
    }
}

if ($out > gmmktime()) {
    // Invalid date - in the future
} elseif ($out >= gmmktime() - (15 * 60)) {
    // Valid, not expired
} elseif ($out > 0) {
    // Valid date, but expired
} else {
    // Invalid date
}
0 голосов
/ 20 июня 2009
$request_time = strtotime($_SERVER['HTTP_DATE']);
$server_time = time();
$difference = abs($request_time - $server_time);
if($difference <= (15 * 60)) {
    //good to go
}

Это просто преобразует их обе в метки времени Unix и сравнивает их, чтобы убедиться, что они не превышают 15 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...