PHP ile RFC2616 tarih dizesi doğrulanıyor

2 Cevap php

Başlık: güvenlik için, bir PHP webcoder istekleri Üyelik gerektirir.

I need to calculate if the Date: header is within 15 minutes of the computer clock. I can easily do this by comparing

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

gerçek tarih. Ancak, strotime de her zaman 'geçerli' olacak, örneğin "şimdi" gibi formatları destekliyor.

Emin insanlar mutlak bir tarih belirtmek yapmak için basit bir yolu var mı. Strictly RFC2616 kontrol şartı bile iyidir, ama değil.

See: http://www.ietf.org/rfc/rfc2616.txt section 3.3.1

2 Cevap

Biraz araştırma yaptım ve strptime() kullanarak bu çözebilir gibi görünüyor. Bu denenmemiş, ve ben sadece strptime () düzgün verilen zaman dilimine göre GMT dizesi dönüştürmek olacağını tahmin ediyorum unutmayın. Bu, en azından başlamak gerekir.

$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
}
$request_time = strtotime($_SERVER['HTTP_DATE']);
$server_time = time();
$difference = abs($request_time - $server_time);
if($difference <= (15 * 60)) {
    //good to go
}

Bu sadece Unix zaman damgasının onları hem dönüştürür ve daha az ya da ayrı 15 dakika eşit olduğundan emin olmak için onları karşılaştırır.