변수처리 unserialize
(PHP 4, PHP 5, PHP 7, PHP 8)
unserialize — 저장된 표현에서 PHP 값 생성
설명
unserialize(string $data
, array $options
= []): mixed
unserialize()는 직렬화된 단일 변수를 가져와 PHP 값으로 다시 변환합니다.
경고 allowed_classes
의 options
값에 관계없이 unserialize()에 신뢰할 수 없는 사용자 입력을 전달하지 마십시오. 직렬화 해제로 인해 개체 인스턴스화 및 자동 로드로 인해 코드가 로드 및 실행될 수 있으며 악의적인 사용자가 이를 악용할 수 있습니다. 직렬화된 데이터를 사용자에게 전달해야 하는 경우 JSON(json_decode() 및 json_encode()을 통해)과 같은 안전한 표준 데이터 교환 형식을 사용하십시오.
외부에 저장된 직렬화된 데이터를 직렬화 해제해야 하는 경우 데이터 유효성 검사를 위해 hash_hmac() 사용을 고려하십시오. 귀하 이외의 다른 사람이 데이터를 수정하지 않았는지 확인하십시오.
매개변수
data
- 직렬화된 문자열입니다.
직렬화 해제되는 변수가 객체인 경우 객체를 성공적으로 재구성한 후 PHP는 자동으로 __unserialize() 또는 __wakeup() 메서드(있는 경우) 호출을 시도합니다.
참고: unserialize_callback_func 지시문unserialize하는 동안 정의되지 않은 클래스를 인스턴스화해야 하는 경우 호출될 콜백 함수를 설정할 수 있습니다. (불완전한 개체 "__PHP_Incomplete_Class"를 가져오는 것을 방지합니다.) php.ini, ini_set() 또는 .htaccess를 사용하여 unserialize_callback_func를 정의하십시오. 정의되지 않은 클래스를 인스턴스화해야 할 때마다 호출됩니다. 이 기능을 비활성화하려면 이 설정을 비우십시오.
options
- 연관 배열로 unserialize()에 제공할 모든 옵션입니다.
유효한 옵션
Name Type 설명 allowed_classes
mixed 수락해야 하는 클래스 이름의 배열, 클래스를 수락하지 않으려면 false
, 모든 클래스를 수락하려면true
입니다. 이 옵션이 정의되고 unserialize()가 허용되지 않는 클래스의 객체를 만나면 객체는 대신 __PHP_Incomplete_Class로 인스턴스화됩니다. 이 옵션을 생략하는 것은true
로 정의하는 것과 같습니다. PHP는 모든 클래스의 객체를 인스턴스화하려고 시도합니다.
반환 값
변환된 값이 반환되며 bool, int, float, string, array 또는 object가 될 수 있습니다.
전달된 문자열이 직렬화 불가능하지 않은 경우 false
가 반환되고 E_NOTICE
가 발행됩니다.
오류/예외
객체는 직렬화 해제 핸들러에서 Throwable을 던질 수 있습니다.
변경 로그
버전 | 설명 |
---|---|
7.1.0 | options 의 allowed_classes 요소는 이제 엄격하게 유형이 지정됩니다. 즉, 배열이나 부울 이외의 것이 제공되면 unserialize()는 false 를 반환하고 E_WARNING 을 발행합니다. |
Examples
예제 #1 unserialize() 예제
<?php
// Here, we use unserialize() to load session data to the
// $session_data array from the string selected from a database.
// This example complements the one described with serialize().
$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
// if the execute or fetch fails, initialize to empty array
$session_data = array();
} else {
// we should now have the serialized data in $tmp[0].
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// something went wrong, initialize to empty array
$session_data = array();
}
}
?>
예제 #2 unserialize_callback_func 예제
<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
ini_set('unserialize_callback_func', 'mycallback'); // set your callback_function
function mycallback($classname)
{
// just include a file containing your class definition
// you get $classname to figure out which class definition is required
}
?>
메모
경고 오류가 발생한 경우와 직렬화된 false
값을 직렬화 해제하는 경우 모두 false
가 반환됩니다. data
를 serialize(false)
와 비교하거나 발행된 E_NOTICE
를 catch하면 이 특별한 경우를 잡을 수 있습니다.
기타
- json_encode() - 값의 JSON 표현을 반환합니다.
- json_decode() - JSON 문자열을 디코딩합니다.
- hash_hmac() - HMAC 메서드를 사용하여 키가 있는 해시 값 생성
- serialize() - 값의 저장 가능한 표현을 생성합니다.
- Autoloading Classes
- unserialize_callback_func
- __wakeup()
- __serialize()
- __unserialize()