Serialização de dados em PHP
A serialização não é um conceito novo, menos ainda é exclusivo da linguagem PHP. Consiste basicamente em transformar um objeto ou um elemento de algum tipo de dado complexo (array, hash, struct etc.) em uma string que o represente. E que com essa string seja possível recriar o objeto inicial.
Como funciona?
Em PHP é muito simples. Basta usar as funções serialize e unserialize. serialize recebe como argumento o objeto a ser serializado e retorna a string serializada. unserialize faz rigorosamente o oposto.
A serialização é de uma simplicidade impressionante quando você precisa manter (por exemplo em uma sessão) ou passar adiante (como em uma URL) vários valores que na verdade são dados relacionados.
Por exemplo, se um objeto que contenha dados de um usuário, como nome, endereço, telefone e vários outros dados precisar ser passado como parâmetro de uma requisição, a solução tradicional seria criar parâmetros diferentes para cada dado a ser passado. E no script que fará a leitura, ler cada uma dessas variáveis. A URL ficaria como:
http://site.com/script.php?nome=joao&sobrenome=silva&endereco=rua+dos+bobos+numero+zero&cpf=11111111111
A solução funciona bem, mas há a preocupação de ter que tratar explicitamente cada um dos parâmetros, e manutenção adicional cada vez que um novo for criado.
Para obter o mesmo resultado, poderíamos passar o objeto serializado. A URL do link poderia ser gerado com o código:
$string = serialize($objeto);
$url = "http://site.com/script.php?obj=" . $string;
Embora o valor do parâmetro não fique muito legível a “olho nu”, existe apenas um parâmetro a ser lido no outro script, dessa forma:
$string = $_GET['obj'];
$objeto = unserialize($string);
E o objeto será ressuscitado com os mesmos atributos de antes. Uma forma até mais interessante de usar esse conceito é para manter na sessão dados que serão consultados freqüentemente. Esse “cache” pode melhorar o desempenho e evitar requisições a banco de dados.
Quando não usar?
Também há várias situações em que não se deve usar a serialização. Talvez a mais óbvia delas seja ao gravar informações em banco de dados.
Por que gravar cada atributo em um campo da tabela, quando eu posso serializar e gravar em um campo só?Porque se fizer isso a consulta seletiva se tornará quase impossível. Não será possível usar os filtros e a ordenação nativos do SGBD. A única forma possível será recuperar todos os registros, fazer um unserialize deles e filtrar/ordenar manualmente. Preciso falar que fica impraticável?
Segurança
A serialização em si não apresenta ameaças à segurança das aplicações, mas seu uso pode agravar falhas já existentes.
Receber a string serializada de fontes que o usuário final tenha acesso (como a URL ou campos hidden em formulários) pode ser perigoso, pois agora o objeto inteiro pode ser modificado de forma maliciosa antes de ser recebido, e não apenas algumas variáveis.
Fazer crítica dos dados recebidos é uma prática que deve ser adotada sempre, mas com objetos trafegando para lá e para cá é melhor dar um pouco mais de atenção, e de preferência, fazê-los trafegar apenas por vias seguras.



Deixe um comentário