변수처리 unserialize

(PHP 4, PHP 5, PHP 7, PHP 8)

unserialize — 저장된 표현에서 PHP 값 생성


설명

unserialize(string $data, array $options = []): mixed

unserialize()는 직렬화된 단일 변수를 가져와 PHP 값으로 다시 변환합니다.

경고 allowed_classesoptions 값에 관계없이 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 optionsallowed_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가 반환됩니다. dataserialize(false)와 비교하거나 발행된 E_NOTICE를 catch하면 이 특별한 경우를 잡을 수 있습니다.


기타