이 기사에서는 PHP의 Y2K38 취약점에 대한 솔루션을 예시를 통해 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
Unix Millennium Bug라고도 알려진 Y2K38은 이 취약점은 모든 32비트 시스템에서 시간을 기록하기 위해 UNIX 타임스탬프 정수를 사용하는 PHP 및 기타 프로그래밍 언어에 영향을 미칩니다.
정수형 변수를 저장할 수 있는 최대 시간은 2038년 1월 19일 03:14:07입니다. 이 시간을 초과하면 정수 값이 오버플로됩니다.
1970년 1월 1일부터 2038년 1월 19일 화요일 03:14:07 UTC까지 2^31 – 1은 0x7FFFFFFFF를 넘어섰습니다. 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 클래스를 사용하여 이 문제를 해결할 수 있습니다. (PHP5.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 ?>
이 기사가 모든 사람이 PHP 프로그래밍을 배우는 데 도움이 되기를 바랍니다.