2009-06-19 1 views
2

Aus Sicherheitsgründen benötigen Anfragen an einen PHP-Webdienst einen Date: -Header.Validieren von rfc2616 Datumszeichenfolge mit PHP

Ich muss berechnen, wenn das Datum: Header innerhalb von 15 Minuten der Computeruhr ist. Ich kann dies leicht tun, indem

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

zu dem aktuellen Datum zu vergleichen. Strotime unterstützt aber auch Formate wie "jetzt", die immer "gültig" sind.

Gibt es einen einfachen Weg, um sicherzustellen, dass Menschen ein absolutes Datum angeben. RFC2616 streng zu prüfen ist noch besser, aber keine Voraussetzung.

Siehe auch: http://www.ietf.org/rfc/rfc2616.txt Abschnitt 3.3.1

Antwort

4

Haben Sie etwas Forschung und es sieht so aus, als könnten Sie dies mit strptime() lösen. Beachten Sie, dass dies nicht getestet ist, und ich denke nur, dass strptime() die Zeichenfolge basierend auf der angegebenen Zeitzone korrekt in GMT konvertiert. Dies sollte dir zumindest den Einstieg erleichtern.

$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

Da Evert über "Hacks" wie "jetzt" besorgt ist, sollte es für gmmktime() prüfen> = gültiges Datum> = gmmktime() - (15 * 60) – VolkerK

+0

Guter Punkt. Sie sollten immer auf Benutzer aufpassen, die rechtzeitig zurückreisen, um Ihren Webservice auszunutzen;) – pix0r

+0

Dies wird mich auf jeden Fall weiterbringen .. danke! – Evert

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

Dies nur wandelt sie sowohl auf Unix-Zeitstempel und vergleicht sie, um sicherzustellen, dass sie weniger als oder gleich 15 Minuten voneinander entfernt.

+0

Das Problem mit dieser Lösung ist, dass ungültige Daten wie "jetzt" akzeptiert werden. – pix0r