php Y2K38 취약점 해결 방법
Y2K38, 일명 유닉스 밀lennium Bug, 이 취약성은 32비트 시스템에서 UNIX 타임스탬프 정수를 사용하여 시간을 기록하는 PHP 및 기타 프로그래밍 언어에 영향을 미칩니다.
전체 변수를 저장할 수 있는 최대 시간 2038년 1월 19일 03:14:07.이 시간이 지나면 성형 수치가 넘쳐난다.
1970년 01월 01일부터 시작, 세계 표준시 2038년 01월 19일 화요일 오전 03:14:07 2^31-1을 초과합니다.2^31 – 1이 바로 0x7FFFFFF, 많은 것을 믿습니다프로그래머들은 모두 보았다. 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비트 기계에서 Da를 사용할 수 있습니다.teTime 클래스가 이 문제를 해결한다.(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
?>
datetime 돌다 unixtime
<?php
// datetime 돌다unixtime
$dt = new DateTime('2040-01-01 12:00:00');
echo $dt->format('U'); // 2209032000
?>
unixtime 돌다datetime
<?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
?>
'개발 꿀팁 > PHP' 카테고리의 다른 글
curl https 요청 방법 가져오기 (0) | 2022.08.22 |
---|---|
php 스트림 파일 전송 및 수신 (0) | 2022.08.22 |
php HTTP 요청 클래스, GET, POST, Multipart/form-data 지원 (0) | 2022.08.19 |
php fsockopen GET/POST를 이용한 양식 제출 및 파일 업로드 (0) | 2022.08.19 |
이미지 Etag를 이용한 사용자 판단 (0) | 2022.08.19 |