php Y 2 K 38脆弱性解決方法


php Y 2 K 38脆弱性解決方法
Y 2 K 38は、Unix Millennium Bugとも呼ばれ、この脆弱性は、すべての32ビットシステムの下でUNIXタイムスタンプ整数で時間を記録するPHP、および他のプログラミング言語に影響します.
1つの整数変数が保存できる最大時間は2038年1月19日03:14:07です.この時間を超えると、整数値がオーバーフローします.
1970年01月01日から、世界標準時2038年01月19日火曜日午前03:14:07に2^31–1を超えた.2^31–1は0 x 7 FFFFFで、多くのプログラマーが見たことがあると信じています.32ビットシステムでは、最大の符号付き整数を表しています.これを使って秒数を表すと、約68.1年に相当し、1970年から2038年まではちょうどこの数だった.
32ビットシステムでは、2038年1月19日03:14:07以降の日付がオーバーフローします.
<?php
$date = '2040-01-01 12:00:00';
echo strtotime($date);                      //     
echo date('Y-m-d H:i:s', strtotime($date)); // 1970-01-01 00:00:00
?>

64ビットシステムは影響を受けますか?
理論的にはできませんが、テストをすることを強くお勧めします.64ビットシステムの下で保存できる日付の最も遠い日付は、現在の宇宙年齢の21倍~292億年である.
32ビットマシンでは、DateTimeクラスを使用してこの問題を解決することができます.(PHP 5.2はこのクラスの導入を開始し、5.3バージョンでいくつかの方法を拡張しました)
コードは次のとおりです.
<?php
$date = '2040-01-01 12:00:00';
$dt = new DateTime($date);
echo $dt->format('U');           // 2209032000
echo $dt->format('Y-m-d H:i:s'); // 2040-01-01 12:00:00 
?>

datetime回転unixtime
<?php
// datetime   unixtime
$dt = new DateTime('2040-01-01 12:00:00');
echo $dt->format('U'); // 2209032000
?>

义齿
<?php
// unixtime   datetime
$dt = new DateTime('@2209032000');
echo $dt->format('Y-m-d H:i:s'); // 2040-01-01 12:00:00
?>

タイムゾーンの設定、timezone_の使用Openメソッドはtimezoneオブジェクトを生成し、DateTimeのsettimezoneメソッドを使用してタイムゾーンを設定します.
<?php
$dt = new DateTime('@1420029030');
$tz = timezone_open('Europe/London');
$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s').'<br>'; // 2014-12-31 12:30:30

$dt = new DateTime('@1420029030');
$tz = timezone_open('Asia/HONG_KONG');
$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s'); // 2014-12-31 20:30:30
?>