(PHP 4, PHP 5, PHP 7, PHP 8)
unserialize — Cria um valor PHP a partir de uma representação armazenada
unserialize() toma uma única variável serializada e converte-a de volta em um valor PHP.
Entradas de usuário não confiáveis não devem ser passadas a unserialize() independente dos valores do elemento allowed_classes
do parâmetro options
. Desserialização pode resultar em um código carregado e executado devido a uma instanciação de objeto e auto-carregamento, e um usuário malicioso pode ser capaz de explorar isto. Use um formato padrão e seguro de troca de dados como JSON (via json_decode() e json_encode()) se for necessário passar dados serializados ao usuário.
Se for necessário desserializar dados armazenados externamente, considere o uso de hash_hmac() para validação de dados. Certifique-se que os dados não foram modificados por outras pessoas.
data
A string serializada.
Se a variável a ser desserializada for um objeto, após a reconstrução bem sucedida do objeto o PHP tentará automaticamente chamar os métodos __unserialize() ou __wakeup() (se existirem).
Nota: unserialize_callback_func directive
É possível definir uma função de retorno de chamada, se uma classe indefinida tiver sido instanciada durante a desserialização. (para evitar receber um objeto imcompleto do tipo object "__PHP_Incomplete_Class".) Deve-se usar o php.ini, a função ini_set() ou o arquivo .htaccess para definir unserialize_callback_func. Toda vez que uma classe indefinida precisar ser instanciada, ela será chamada. Para desabilitar este recurso basta esvaziar esta configuração.
options
Quaisquer opções podem ser fornecidas a unserialize() como um array associativo.
Nome | Tipo | Descrição |
---|---|---|
allowed_classes | mixed | Pode ser um array de nomes de classe que devem ser aceitas, false para não aceitar nenhuma classe, ou true para aceitar todas as classes. Se esta opção for definida e unserialize() encontrar um objeto de uma classe que não deve ser aceita, o objeto será instanciado como uma __PHP_Incomplete_Class. Omitir esta opção é o mesmo que defini-la como true : o PHP tentará instanciar objetos de qualquer classe. |
max_depth | int | A profundidade máxima de estruturas permitidas durante a desserialização, com a intenção de prevenir sobrecarga de pilha. O limite padrão de profundidade é 4096 e pode ser desabilitado definindo-se max_depth para 0 . |
O valor convertido é retornado, e pode ser bool, int, float, string, array ou object.
Caso a string informada não for desserializável, false
é retornado e um erro de nível E_WARNING
é emitido.
Objetos podem disparar exceções da classe Throwable em seus manipuladores de desserialização.
Versão | Descrição |
---|---|
8.3.0 | Agora emite um E_WARNING quando a string informada não for desserializável; anteriormente um E_NOTICE era emitido. |
7.4.0 | Adicionado elemento max_depth do array options para definir a profundidade máxima de estruturas permitidas durante desserialização. |
7.1.0 | O elemento allowed_classes de options ) agora é estritamente tipado, isto é, se algo que não seja um array ou um bool for fornecido, unserialize() retorna false e emite um erro de nível E_WARNING . |
Exemplo #1 Exemplo de unserialize()
<?php
// Aqui, será usado unserialize() para carregar dados de sessão para o
// array $session_data a partir de uma string selecionada de um banco de dados.
// Este exemplo complementa o descrito em 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)) {
// se a execute ou fetch falharem, inicializa como um array vazio
$session_data = array();
} else {
// agora os dados serializados devem estar em $tmp[0].
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// algo deu errado, inicializa como um array vazio
$session_data = array();
}
}
?>
Exemplo #2 Exemplo de unserialize_callback_func
<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
ini_set('unserialize_callback_func', 'mycallback'); // define a função de retorno de chamada
function mycallback($classname)
{
// apenas inclua um arquivo contendo sua definição de classe