簡體   English   中英

使用PHP驗證rfc2616日期字符串

[英]Validating rfc2616 date string with PHP

為了安全起見,對PHP Web服務的請求將需要一個Date:標頭。

我需要計算Date:標頭是否在計算機時鍾的15分鍾內。 我可以通過比較輕松地做到這一點

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

到實際日期。 但是,strotime還支持諸如“ now”之類的格式,這些格式將始終為“有效”。

有沒有一種直接的方法來確保人們指定一個絕對日期。 嚴格檢查RFC2616甚至更好,但不是必需的。

請參閱: http//www.ietf.org/rfc/rfc2616.txt第3.3.1節

做了一些研究,看起來您可以使用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
}
$request_time = strtotime($_SERVER['HTTP_DATE']);
$server_time = time();
$difference = abs($request_time - $server_time);
if($difference <= (15 * 60)) {
    //good to go
}

這只是將它們都轉換為Unix時間戳,並進行比較以確保它們之間的間隔小於或等於15分鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM