2009-06-19 12 views
2

セキュリティのため、PHP WebサービスへのリクエストにはDate:ヘッダーが必要です。PHPのrfc2616日付文字列の検証

Date:ヘッダーがコンピュータ時計の15分以内にあるかどうかを計算する必要があります。 比較すると簡単にこれを行うことができます

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

実際の日付に簡単にすることができます。ただし、 "now"などの形式もサポートされています。これは常に有効です。

人々が絶対日付を指定できるようにする簡単な方法はありますか? RFC2616を厳密にチェックすることは、さらに優れていますが、要件ではありません。

参照: http://www.ietf.org/rfc/rfc2616.txtセクション3.3.1

答えて

4

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

Evertは "今"のような "ハック"を心配しているので、gmmktime()> =有効な日付> = gmmktime() - (15 * 60) – VolkerK

+0

をテストする必要があります。あなたはいつもあなたのウェブサービスを悪用しようと時間を遡って旅行するユーザーのために気をつけなければなりません;) – pix0r

+0

これは間違いなく私を始めます..ありがとう! – Evert

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

これはただのUnixタイムスタンプにそれらの両方を変換し、彼らは以下離れて15分に等しいしていることを確認するためにそれらを比較します。

+0

このソリューションの問題は、「今」などの無効な日付を受け入れることです。 – pix0r