首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHP验证rfc2616日期字符串

用PHP验证rfc2616日期字符串
EN

Stack Overflow用户
提问于 2009-06-19 20:25:32
回答 2查看 839关注 0票数 2

出于安全性考虑,对PHP For服务的请求将需要Date: header。

我需要计算Date:头是否在计算机时钟的15分钟内。通过比较,我可以很容易做到这一点

代码语言:javascript
复制
$dt = new DateTime($_SERVER['HTTP_DATE']);

到实际日期。然而,strotime也支持诸如"now“这样的格式,这些格式将始终是”有效的“。

有没有一种简单的方法来确保人们指定一个绝对日期。严格检查RFC2616甚至更好,但不是必需的。

请参阅:http://www.ietf.org/rfc/rfc2616.txt第3.3.1节

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-19 21:42:38

我做了一些研究,看起来你可以用strptime()解决这个问题。请注意,这是未经测试的,我只是猜测strptime()会根据提供的时区将字符串正确地转换为GMT。这至少可以让你开始学习。

代码语言:javascript
复制
$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
}
票数 4
EN

Stack Overflow用户

发布于 2009-06-19 20:52:08

代码语言:javascript
复制
$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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1019893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档