30年倒计时开始,php中Y2K38的漏洞解决方法实例分析
分类:高并发

正文实例解析了php中Y2K38疏漏的消除措施。分享给大家供大家参谋。具体解析如下:

前言

贰零零捌年10月十22日周天是三个值得注意的日子,它评释了Y2K38 bug 30年倒计时初始。Y2K38是指Unix系统时间使用的33人整数将在2038年溢出。从1967年5月1日始发,到2038年超出2^31,确切的大运是世界标定时2038年八月12日礼拜五清晨03:14:07

Y2K38,又称 Unix Millennium Bug, 此漏洞将会影响到具有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及任何编制程序语言。

目前在写一个门类接口。测量检验中发觉服务器上测验正常的功效,在本地一向反常。一步步的每一种核实,最后锁定难题是由于函数strtotime回到了二个false值,以致数据插入数据库退步。

叁个整型的变量所能保存的最大日子为 2038 年 1 月 19 日 03:14:07。当先这么些时刻后,整型数值将会溢出。

一致代码运营结果分歧等,原因那就是景况不平等导致。要么是PHP版本分裂,要么是位数不一致。

从 一九六六 年 01 月 01 日始发,到世界标按期 2038 年 01 月 19 日星期四黎明先生03:14:07 超越 2^31 – 1。2^31 – 1 便是0x7FFFFFFF,相信广大编制程序员都看过,在 33位系统里,那代表最大的有标记整数。假诺用它来表示秒数,大致相当于 68.1 年,从 壹玖柒零 年到 2038 年恰恰是其一数。

本人Computer是陆拾三人的。这里是PHP位数不适合,服务器使用62位,而笔者本地是叁十三个人。而strtotime被传播了三个字符串2050-1-1 23:59:59,该参数大于了2038-1-19 03:14:07所以在三十一个人PHP下直接回到false,而63人PHP不受影响。

三11位系统下显得2038年十一月二十二日03:14:07从此的日子将会溢出。

Y2K38漏洞

那么64 位系统会碰到震慑呢?

引致上述难点的根本原因就是Y2K38漏洞,也被称为Unix Millennium Bug

理论上不会,猛烈建议进行一下测量试验。60个人系统下得以保留的日期最远日期是明天宇宙年龄的 21 倍~ 292 亿年。

三14人系统或PHP

在三14个人机器上,能够选拔DateTime类来缓慢解决那么些主题素材。(PHP5.2初步引进那些类,并在5.3本子中扩展了有的办法)

此漏洞将会影响到具有 32 位系统下用UNIX 时间戳整数来记录时间的 PHP,及别的编制程序语言。叁个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超越那几个小时后,整型数值将会溢出。

代码如下:

陆九人系统或PHP

format('U');      // 2209032000
echo $dt->format('Y-m-d H:i:s'); // 2040-01-01 12:00:00 
?>

陆十六位系统下得以保留的日子最远日期是今后宇宙年龄的21倍——292亿年。所以不会惨被该漏洞影响。

愿意本文所述对我们PHP程序设计的读书抱有助于。

什么样检查实验

怎么明白您的系统是或不是抽取该漏洞的熏陶。很简短,间接利用strtotime去调换一个胜出2038年1月19日03:14:07日子。恐怕利用date函数将二个抢先2147454847日子戳转换为日期。

方法一

echo date("Y-m-d H:i:s",2556115199); 

地方结果一旦回到2050-12-31 23:59:59那么就没反常。假如回到壹玖壹贰-11-25 09:31:43那么就受抽出影响。

方法二

var_dump(strtotime("2050-12-31 23:59:59"));

下边结果一旦回到2556115199那正是说好似常。假设回到false这正是说也会惨被震慑。

赶尽杀绝方案

方案一

转移系统和PHP均为六十五个人。那一个代价超级大,然而足以长久解决难点。

方案二

PHP5.2版本之后提供了三个函数DateTime能够一时消除一下主题材料。

// 1、日期字符串转换为时间戳$obj = new DateTime("2050-12-31 23:59:59");echo $obj->format; // 2556115199// 2、时间戳转换为日期字符串$obj = new DateTime; // 这里时间戳前要写一个@符号$timezone = timezone_open; // 设置时区$obj->setTimezone; echo $obj->format; // 2050-12-31 23:59:59// 而且DateTime还可以有其他玩法$obj = new DateTime("2050-12-31 23:59:59");echo $obj->format; // 换种方式输入时间字符串2050/12/31 23:59:59

通过DateTime类来操作日期不会遭到Y2K38漏洞的熏陶,能够最远扶助到9999年12月31日

总结

上述正是那篇小说的全体内容了,希望本文的内容对大家的求学可能办事能带来一定的援救,假诺有疑问我们能够留言交换,多谢大家对台本之家的支撑。

本文由10bet手机官网发布于高并发,转载请注明出处:30年倒计时开始,php中Y2K38的漏洞解决方法实例分析

上一篇:stristr四个函数的区别总结,php中查找字符吕函数之strstr 下一篇:print类函数使用总结,PHP中常用的输出函数总结
猜你喜欢
热门排行
精彩图文