>  기사  >  백엔드 개발  >  php_php 기술의 Y2K38 취약점 솔루션 분석 예시

php_php 기술의 Y2K38 취약점 솔루션 분석 예시

WBOY
WBOY원래의
2016-05-16 20:35:53870검색

이 기사에서는 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 이후에 표시되는 날짜는 오버플로됩니다.

<&#63;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
&#63;>

그럼 64비트 시스템도 영향을 받나요?

이론적으로는 테스트해 보시는 것을 적극 권장합니다. 64비트 시스템에서 저장할 수 있는 가장 먼 날짜는 현재 우주나이의 21배~292억년이다.

32비트 시스템에서는 DateTime 클래스를 사용하여 이 문제를 해결할 수 있습니다. (PHP5.2부터 이 클래스를 도입하기 시작했고 버전 5.3에서 일부 메소드를 확장했습니다.)

코드는 다음과 같습니다.

<&#63;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 
&#63;>

이 기사가 모든 사람이 PHP 프로그래밍을 배우는 데 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.