php - 使用 PHP 验证 rfc2616 日期字符串

标签 php http validation datetime

为了安全起见,对 PHP Web 服务的请求将需要 Date: header 。

我需要计算 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
}

关于php - 使用 PHP 验证 rfc2616 日期字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019893/

相关文章:

php - 使用 php include 时 .htaccess 出现困惑

php - 将 php 变量传递给 html

php - 我如何知道正在用 PHP 加载脚本的页面的 URL?

ruby-on-rails - 对于 Rails 应用程序,我应该在数据库和模型中进行验证吗?

php - 使用删除查询时 PHP 代码中的结果始终为 TRUE

php - 使用两个模型循环 Laravel 模型

http - X-Cloud-Trace-Context 的目的是什么?

json - 在golang中将Json转换为字符串

javascript - jquery.validator 和一页上的两个联系表格将在提交时验证空的一个

python - 在 python 中验证 yaml 文档