Desvendando os certificados SSL grátis

desvendando ssl grátis

Certificados SSL grátis | Imagem Ilustrativa – Fonte Freepik

Podemos dizer que a popularização dos certificados SSL no tráfego de informações de qualquer site na internet é uma das notícias mais importantes que tivemos este ano. Não por menos, afinal ela veio em um momento onde recebemos notícias diárias sobre vazamentos de informações sigilosas, dados pessoais, grandes invasões. Resumindo, com nossas vidas cada dia mais passando por meios digitais a segurança de dados se tornou importante demais para ser utilizada por apenas poucos.

Mas porque tivemos este ano como um marco para esta popularização da segurança da internet? Simples. Graças ao lançamento oficial da autoridade Certificadora Let’s Encrypt™ feito neste ano, agora qualquer site, loja virtual, blog ou portal de informações pode desfrutar da segurança do cadeado verde que acompanha o campo de URL em nosso navegador, sem pagar nada por isto. A autoridade que é desenvolvida e mantida pela Linux Foundation fornece certificados SSL de forma gratuita e automatizada.

Além disto, sua api de integração fácil permitiu o desenvolvimento de interfaces para sua aplicação em empresas de hospedagem. Nossas as hospedagens compartilhadas e hospedagem cloud, por exemplo, já possuem esta integração e renovação completamente atualizadas utilizando a certificação Let’s Encrypt™.

Correndo atrás desta tendência, a autoridade certificadora Comodo, em conjunto com o CPanel, também começou a disponibilizar uma versão de seu SSL gratuitamente. Ela se dá pela ferramenta AutoSSL implementada pelo CPanel em sua distribuição 58.

O que está por traz de tanta segurança e de forma gratuita?

No caso da Let’s Encrypt™, as regras de segurança são desenvolvidas e mantidas pelo ISRG (Internet Security Research Group. Ou Grupo de pesquisa em segurança da internet, em português) na califórnia. O projeto faz parte do Linux foundation Collaborative Projects. Dado isto podemos confirmar um bom ar de confiança ao projeto.

A Let’s Encrypt™ foi responsável por implementar um novo protocolo chamado ACME. Este protocolo tem o intuito de tornar mais simples a obtenção e a configuração de certificados SSL. Apesar de sua implementação ser mais simples, isto não prejudica a segurança. Os certificados emitidos baseiam-se nas melhores práticas de segurança TLS. Além disto, eles possuem chaves de criptografia de até 4096bits.

O funcionamento por traz da validação de um domínio

O sistema Let’s Encrypt™ valida um domínio através de um processo de “challenges” (desafios) onde o servidor que controla determinado domínio precisa comprovar o controle do domínio que deseja ativar o certificado.

Funciona assim, o servidor proprietário do domínio perguntará ao Let’s Encrypt™ o que é preciso fazer para provar o controle de um determinado domínio. A entidade então irá retornar algumas opções de validação, como por exemplo, através de um registro de DNS ou através de uma URI.

Durante o processo a Let’s Encrypt™ CA irá disponibilizar um código único que deverá ser assinado, com o par de chaves privadas, pelo agente validador e assim, provar que ele controla as chaves privadas.

Assim que concluído este passo, deve ser criado um arquivo no caminho especificado no site em questão. O agente validador deve assinar o código com sua chave privada. Finalizadas estas questões o Let’s Encrypt™ poderá checar o arquivo que foi colocado no servidor web para ter a garantia da validade deste domínio. Se a validade é garantida seu certificado será ativado e poderá ser visto através do navegador.

Validando certificado

Processo de validação do certificado SSL Let’s Encrypt

Certificado SSL automatizado

A parte boa nisto tudo é que o sistema do Let’s Encrypt é totalmente automatizado e aberto. Assim, já é possível encontrar serviços que disponibilizam a instalação dos certificados sem que seja necessário realizar todo o processo de validação da forma mais dolorosa. É o caso, por exemplo, da nossa plataforma de gerenciamento de hospedagem. Através de uma interface simples é possível ativar e revogar certificados. E o processo de renovação é feito automaticamente após os 90 dias de validade do certificado.

Ativação de SSL Grátis pela DialHost

Ativação de SSL Grátis pela DialHost

A evolução do Mercado

O Let’s Encrypt trouxe uma perspectiva completamente nova para a segurança nas informações que circulam na internet. Agora não existe mais motivos para um site permanecer sem segurança SSL. Mesmo se seu site possuir apenas o bom e velho formulário de contatos e não tiver tanta informação sigilosa esta proteção extra deve ser levada em conta. Tanto deve, que ferramentas de busca , como o Google, já começam a utilizar o uso  do HTTPS como fator de ranqueamento em suas buscas.  Existe ainda uma proposta do navegador Chrome para começar a alertar sites que não utilizam certificados SSL, como sites não seguros.

“Atualmente, o Chrome indica conexões HTTP com um indicador neutro. Isso não reflete a verdadeira falta de segurança em conexões HTTP.” Diz Emily Schechter, membra da equipe de segurança do Chrome.

E como fica o mercado SSL atual?

É claro que este mercado terá forte mudança. Com a popularização dos certificados SSL grátis o que se espera é uma queda nas vendas dos certificados SSL mais simples. É claro que isto não implica na morte dos certificados SSL pagos. Afinal, eles proporcionam, além da segurança na informação, coberturas por seguros reais. E ainda existem categorias que validam a empresa como um todo e não somente o domínio. Este último, traz ainda mais credibilidade ao usuário. No caso de compras ou operações financeiras, o certificado garante a ele estar usando o site real da empresa desejada.

E vocês o que esperam sobre os próximos passos da segurança na internet? Será que teremos ainda mais sistemas colaborativos neste intuito? Será que o mercado proprietário conseguirá trazer soluções ainda mais robustas para garantir sua privacidade?

 

 

Felipe Moraes
Felipe Moraes

Gerente de desenvolvimento na DialHost, Designer Gráfico formado pela Universidade FUMEC, Minas Gerais e Pós graduando em Branding pelo Centro Universitário UNA, possuo interesse em design de interação e interfaces. Trabalha com programação e criação para web, desde 2006. Apreciador de Bacon, Pudim e music Tag.

count_chars – Tratamento de strings com PHP

count_chars - Tratamento de strings com PHP

Imagem ilustrativa

Estou de volta com o 4ª post sobre tratamento de strings, e para esta postagem estudei um pouco sobre o count_chars. A função basicamente faz a contagem das ocorrências dos caracteres de uma string. Assim, é possível avaliar quantas vezes um determinado caractere repete dentro desta string.

A função possui 4 modos de busca que são passados por parâmetros. Abaixo vou explicar um pouco de cada um destes modos.

count_chars na prática

Como a teoria desta função é relativamente simples não vamos nos prolongar e colocar a mão na massa com um exemplo bem simples usando este comando.

count_chars no modo 0

Ao utilizar a função no modo 0 – count_chars($text_print,0) – O comando retornará um array com os códigos ASCII de todos os caracteres ASCII em um array e mostrará a ocorrência de cada um deles, mesmo os que não tiveram ocorrência.

Abaixo fiz um teste com a frase “DialHost – Desenvolvendo um exemplo com count_chars”.

<?php 
    $text_print = 'DialHost - Desenvolvendo um exemplo com count_chars';
    $str_md0 = count_chars($text_print,0);
    echo '<h2> String de exemplo: '.$text_print.'</h2>';
    echo '<hr>';
    echo '<h2> Imprimindo todas as ocorrencias de todos os tipos de caracteres dentro da String:</h2>';
    echo '<p>'; 
    foreach ($str_md0 as $key=>$value){echo utf8_encode(chr($key)). ': ' . $value . ' vezes'.'<br>'; };
    echo '</p>';
?>

Defini a variável $text_print para colocar a frase que eu gostaria de analisar e então coloquei o resultado do count_chars dentro da variável $str_md0. Isto porque ele me retorna um array e eu terei que tratá-lo para ter a impressão correta das recorrências dos caracteres. Agora que já temos todos os caracteres dentro do array é só varrer este array e ir imprimindo os respectivos caracteres e suas ocorrências na string.

Neste código tive que usar o utf8_encode e o comando chr. O primeiro para mostrar os caracteres especiais de forma correta e o segundo para identificar o caractere referente ao código ASCII do array. Vale lembrar que o retorno deste comando é enorme já que ele retorna tanto os caracteres que foram utilizados quanto os que não foram. Confiram o resultado neste link.

Modo 1

O modo 1 – count_chars($text_print,1) – já possui um filtro sobre as ocorrências da string. Ele avalia a string e retorna um array de todos os caracteres ASCII que possuem pelo menos uma ocorrência. Isto evita a lista gigantesca de caracteres que não estão presentes na string passada. Abaixo está o mesmo exemplo que fiz no modo 0 só que agora utilizando o modo 1:

<?php 
    $text_print = 'DialHost - Desenvolvendo um exemplo com count_chars';
    $str_md1 = count_chars($text_print,1);
    echo '<h2> String de exemplo: '.$text_print.'</h2>';
    echo '<hr>';
    echo '<a name="mod1"><h2> Imprimindo todas as ocorrencias dos caracteres que existem na String:</h2></a>';
    echo '<p>'; 
    foreach ($str_md0 as $key=>$value){echo utf8_encode(chr($key)). ': ' . $value . ' vezes'.'<br>'; };
    echo '</p>';
?>

Em suma aqui está tudo igual ao item anterior, a diferença será no restultado que vocês podem conferir neste link

Modo 2

Se o modo 1 mostra todas os caracteres que possuíram pelo menos 1 ocorrência, o modo 2 faz exatamente o contrário. Ele avalia a string e retorna um array de todos os caracteres ASCII que não possuem ocorrências.

<?php 
    $text_print = 'DialHost - Desenvolvendo um exemplo com count_chars';
    $str_md1 = count_chars($text_print,2);
    echo '<h2> String de exemplo: '.$text_print.'</h2>';
    echo '<hr>';
    echo '<a name="mod2"><h2>Imprimindo todos os caracteres que não possuem ocorrências na String:</h2></a>';
    echo '<p>'; 
    foreach ($str_md0 as $key=>$value){echo utf8_encode(chr($key)). ': ' . $value . ' vezes'.'<br>'; };
    echo '</p>';
?>

Novamente, a diferença será no resultado que vocês podem conferir neste link

Modo 3

O modo 3 é mais simples que os demais. Ele apenas retornará todos os caracteres utilizados pela string. Desta vez porém, não retornará quantas vezes ele se repetiu. O retorno será uma simples string que no exemplo abaixo retornará isto: -DH_acdehilmnoprstuvx.

<?php 
$text_print = 'DialHost - Desenvolvendo um exemplo com count_chars';
echo '<a name="mod3"><h2> Imprimindo todos os caracteres utilizados na String:</h2></a>';
echo '<p>'.utf8_encode(count_chars($text_print,3)).'</p>';
?>

Para conferir o resultado deste exemplo basta clicar neste link.

Modo 4

Acho que todos já estão prevendo que este último modo não será nenhuma novidade… sim ele tem o efeito contrário do modo 3 exibindo apenas os caracteres não utilizados na string.

&lt;?php 
$text_print = 'DialHost - Desenvolvendo um exemplo com count_chars';
echo '&lt;a name="mod4"&gt;&lt;h2&gt; Imprimindo todos os caracteres não utilizados na String:&lt;/h2&gt;&lt;/a&gt;';
echo '&lt;p&gt;'.utf8_encode(count_chars($text_print,4)).'&lt;/p&gt;';
?&gt;

Para conferir o resultado deste exemplo basta clicar neste link.
Bem, espero que este comando tenha sido útil para vocês e nos vemos na próxima. Quem quiser se aprofundar sobre exemplos de uso deste comando o manual do PHP pode ser muito útil

Tenha todo o desempenho para o seu site com a Hospedagem Cloud DialHost. Servidores em cloud prontos para receber sites em PHP. Saiba Mais.

 

Felipe Moraes
Felipe Moraes

Gerente de desenvolvimento na DialHost, Designer Gráfico formado pela Universidade FUMEC, Minas Gerais e Pós graduando em Branding pelo Centro Universitário UNA, possuo interesse em design de interação e interfaces. Trabalha com programação e criação para web, desde 2006. Apreciador de Bacon, Pudim e music Tag.

utf8_decode e utf8_encode tratando com codificação Unicode

utf8_decode e utf8_encode

Imagem ilustrativa para utf8_decode e utf8_encode

Olá pessoal, estou de volta para o terceiro post da série sobre tratamento de strings com PHP. Hoje falarei um pouco sobre os comandos utf8_decode e utf8_encode, trazendo uma melhor explicação para o uso feito no exemplo do post passado “strlen, desvendando os tamanhos de uma string”.

Só para lembrar, no post passado, utilizamos o comando utf8_decode para consertar a contagem de caracteres com acentuação. Sem a utilização deste comando, o strlen() acabava contando letras acentuadas como 2 caracteres. Mas, por que o comando utf8_decode()  resolve este problema? Que magia é essa?

Desvendando o utf8_decode

Como a segunda palavra já diz, o decode funciona para decodificar um determinado dado, passado como parâmetro, do formato utf8 para o ISO-8859-1. Sim, talvez o comando mais explicito seria utf-8_to_ISO-8859_decode(), mas acredito que isto seria muito grande para a função. Enfim, o fato é que o decode se limita à formatação ISO-8859-1, sendo assim se você não necessita utilizar este tipo de codificação já pode parar por aqui. Talvez este artigo não tenha nada a lhe acrescentar.

Dica: Se vocês está precisando fazer decodes com outros formatos você pode dar uma olhada no comando iconv().

Para todos os outros que desejam descobrir a razão do caractere acentuado retornar como 2 caracteres, a explicação é simples. O padrão utf-8 utiliza um padrão de valores entre 1 e 4 bytes, por caractere. Assim, quando temos caracteres do tipo á, é, í… os mesmos utilizam 2 bytes que são contados então, como 2 caracteres pela função strlen();

Dica: Se o texto a ser decodificado não estiver codificado em utf-8 o comando pode apresentar resultados indesejados.

O utf8_encode

O utf8_encode() faz exatamente o contrário da função utf8_decode, ela decodifica uma string no padrão ISO-8859-1 para o padrão utf-8. Assim uma determinada string do padrão latino pode ser utilizada juntamente com outros caracteres sem ocorrer erros de renderização. Aqueles famosos caracteres de interrogação ().

Um Exemplo bem útil para o uso destes dois comandos é na criação de URLS amigáveis

function smartURL($str){
    $str = strtolower(utf8_decode($str)); $i=1;
    $str = strstr($str, utf8_decode('àáâãäåæçèéêëìíîïñòóôõöøùúûýýÿ'), 'aaaaaaaceeeeiiiinoooooouuuyyy');
    $str = preg_replace("/([^a-z0-9])/",'-',utf8_encode($str));
    while($i>0) $str = str_replace('--','-',$str,$i);
    if (substr($str, -1) == '-') $str = substr($str, 0, -1);
    return $str;
}

No exemplo acima o utf8_decode() foi utilizado para remover possíveis incompatibilidades com acentos e letras maiúsculas. A função basicamente remove caracteres maiúsculos com  strtolower(), remove qualquer acentuação com strstr(). Depois ele remove qualquer caractere que não sejam de a-z e 0-9 utilizando o preg_replace(). Por fim, substitui-se as duplicações de ‘-‘ e remove um possível ‘-‘ no último caractere com str_replace  e substr() respectivamente.

Concluindo, o utf8_decode e utf8_encode são funções auxiliares muito úteis para conversão entre caracteres latinos e o formato universal. Muitas vezes elas são utilizadas para tratamento de acentuações, e caracteres especiais inclusos no formato latino. Lembrando que se você não utiliza caracteres latinos, este comandos não terão nenhum efeito para sua aplicação.

Espero que tenha ajudado com esta explicação e até a próxima.

Tenha todo o desempenho para o seu site com a Hospedagem Cloud DialHost. Servidores em cloud prontos para receber sites em PHP. Saiba Mais.

 

Felipe Moraes
Felipe Moraes

Gerente de desenvolvimento na DialHost, Designer Gráfico formado pela Universidade FUMEC, Minas Gerais e Pós graduando em Branding pelo Centro Universitário UNA, possuo interesse em design de interação e interfaces. Trabalha com programação e criação para web, desde 2006. Apreciador de Bacon, Pudim e music Tag.

Password Hashing – API nativa para gerenciamento de senhas

 

Imagem ilustrativa

Imagem ilustrativa

A segurança de dados sensíveis dos usuários é sempre um fator determinante para a integridade de qualquer aplicação. Dada essa premissa, esforços são constantes nessa área para prover os sistemas computacionais de formatos criptografados cada vez mais seguros.

Senhas geralmente são armazenadas em hash, que nada mais é do que um símbolo derivado de um algoritmo que o torna incapaz de, à luz da teoria, obter seu estado original. Apesar do nível de complexidade de algoritmos que geram hashes, temos hoje diversas formas que tentam recuperar dados originais “escondidos” através de dicionários, rainbow tables ou força bruta.

Pensando nisso, desenvolvedores da linguagem PHP, preocupados não só com a integridade de senhas mas também com a facilidade de programação oferecida pela linguagem, optaram por criar uma API nativa capaz de somar ao mesmo tempo segurança e simplicidade para armazenamento de credenciais. Criaram então uma extensão de criptografia chamada Password Hashing, disponível desde a versão 5.5.0. Essa extensão utiliza o algoritmo bcrypt, o mais forte suportado pelo PHP atualmente.

Recursos oferecidos

A API oferece um pequeno e poderoso conjunto de funções capazes de auxiliar o programador a criar hashes seguros, realizando todo o trabalho braçal de forma segura e com alto grau de confiabilidade. A seguir, suas respectivas funções:

password_hash

Cria um novo hash de senha usando um algoritmo de hashing. O caso geral para esta função é atribuir um custo (potência matemática) razoável para o algoritmo e deixá-lo criar um salt (parâmetro que gera aleatoriedade da saída) qualquer. O uso de bcrypt sempre retornará uma string de 60 caracteres.

1 <?php
2 echo password_hash("imasters",
3 PASSWORD_BCRYPT,
4 [
5 "cost" => 12, // Se omitido, custo 10
6 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) // Você pode omitir este parâmetro para geração de salt aleatório também.
7 ]
8 );
9 // Resultado $2y$12$syPYpcHYHWfyraREZ5BCc./OiKezWghwO/5HsbvNv0U4G1xqjsguW

password_verify

Verifica se uma senha corresponde a um hash.

1 <?php
2
3 if(password_verify('imasters', '$2y$12$sy...'))
4 echo 'Senha válida!';
5 else
6 echo 'Senha inválida!';

password_get_info

Retorna informações sobre o hash dado como algoritmo usado e custo.

1 <?php
2 var_dump(password_get_info('$2y$12$sy...'));

password_needs_rehash

Verifica se um determinado hash corresponde a informações fornecidas. Caso não seja, assume-se que ele precisa sofrer o processo de hash novamente. Como a função retorna apenas um valor booleano, seu real uso pode ser observado abaixo, quando troco as configurações de geração de hash, ou seja, a senha é válida para aquele algoritmo, mas não para o novo custo que inseri, então gero o hash novamente para a nova configuração.

1 <?php
2 $senha = 'imasters';
3 $hash = '$2y$12$sy...';
4 if(password_verify('imasters', $hash)) {
5 echo "A senha é válida\n";
6 if(password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 11])) { // Mudei o custo para 11
7 echo "Senha precisa de novo hash\n";
8 $hash = password_hash($senha, PASSWORD_BCRYPT, ['cost' => 11]); // Gerei o novo hash
9 echo $hash; // Basta salvar no banco de dados agora
10 }
11 else
12 echo "Senha não precisa de novo hash";
13 }
14 else
15 echo "Senha não verificada";

 

Conclusões

Neste artigo, mostramos a facilidade e a simplicidade do gerenciamento de senhas com a API Password Hashing, acompanhadas de um poderoso algoritmo, o bcrypt. O grande objetivo desse recurso é fazer com que você se preocupe mais com as funcionalidades da sua aplicação ao usuário e menos com a complexidade da segurança de senhas.

Referências:

 

Victor Torres
Victor Torres

É Jedi na DialHost, bacharel em Ciência da Computação e mestrando em Modelagem Matemática e Computacional pelo CEFET. Trabalha com desenvolvimento web desde 2007. Pesquisador de otimização e criptografia, é apreciador de um bom café e fã de histórias futuristas.

Engenharia Reversa e códigos criptografados

Engenharia Reversa

Imagem Ilustrativa – Engenharia Reversa

Introdução

Softwares capazes de criptografar a escrita de códigos fonte em diversas linguagens estão espalhados pela rede. Geralmente pagos, tais programas são capazes de fornecer ao usuário certa confiabilidade de que seu código não será modificado por terceiros e a vantagem do encapsulamento de toda a lógica de programação envolvida na criação do programa em questão. Você vai encontrar muitos destes códigos principalmente em produtos vendidos com uma licença, onde mesmo portando todos os arquivos necessários para o funcionamento, estes são ilegíveis para o usuário. Podemos citar alguns exemplos utilizados na linguagem PHP como ionCube, ZendGuard, phpSHIELD e sourceguardian.

Limitações de software

Infelizmente, alguns destes produtos possuem pouca ou nenhuma documentação (não sei se é porque os autores os consideram autoexplicativos ou tem preguiça mesmo) tornando dolorosa a integração no seu ambiente de desenvolvimento. Caso a empresa fornecedora ainda disponibilize uma API, a situação complica ainda mais  pois a possível integração com outros programas faz com que o detalhamento de uma documentação forte (tipos dos parâmetros, modelo de resposta de sucesso/erro, tratamentos, etc) e concisa seja mais necessária ainda.

Caindo nesta situação ou não, códigos compilados sempre são uma dor de cabeça para quem precisa conhecer mais detalhes de implementação. “Ah mas se alguém fez isso, a intenção é que essa pessoa não quer a edição do código e sim que ele seja simplesmente usado, sem alterações.  Além disso, por causa de licenças, é até ilegal tentar reverter ou obter detalhes específicos da implementação do autor”. Certo, não vou entrar em detalhes do que se pode/deve fazer com códigos criptografados, inclusive muitos deles vêm com uma mensagem de alerta já sobre este tipo de prática e.g “You may not reverse engineer, decompile, defeat license encryption mechanisms, or disassemble this software product or software product license”. O caso aqui é apenas informativo, estamos aplicando conhecimento, não incentivando a prática de sabotagem e violação de direitos e políticas de uso.

Técnicas de engenharia reversa

Estamos trabalhando com a linguagem PHP neste artigo, portanto iremos usar as ferramentas disponibilizadas nativamente pela linguagem para tentar descobrir detalhes de implementação de arquivos os quais não conseguimos acesso ao fonte original. Não mencionarei aqui o uso de debuggers como Xdebug (que pode ser uma boa opção) pois gostaria de dar foco diretamente a classes e funções da linguagem para que vocês possam dar uma olhada em um nível um pouco mais baixo, assim verão a variedade de técnicas que podemos usar para obter detalhes de uma “caixa preta”.

Estão listadas aqui as principais funções/classes do PHP que nos serão úteis para dar um debug em determinadas funcionalidades:

get_declared_functions() – Retorna um array com todas as funções definidas em tempo de execução;
get_defined_vars() – Retorna um array com todas as variáveis declaradas em tempo de execução;
get_declared_classes() – Retorna um array com o nome das classes definidas em tempo de execução;
ReflectionFunction – Reporta informações sobre uma função (a API inteira do Reflection por si já desempenha o papel na engenharia reversa) ;
ReflectionClass – Reporta informações sobre uma classe (a API inteira do Reflection por si já desempenha o papel na engenharia reversa) ;
debug_backtrace() – Gera um backtrace a partir do ponto que foi chamado
debug_print_backtrace() – Lista o backtrace de chamadas de funções no php (mais simples que o debug_backtrace)

Utilizar estas ferramentas pode ou não ser uma tarefa fácil. Se o autor comentou corretamente o cabeçalho das funções com o tipo dos parâmetros, o retorno, alguma explicação e outros detalhes, há uma chance maior de conhecermos a lógica da programação da classe ou função. Percebam que este é um trabalho investigativo e por vezes cansativo e frustrante. Porém, é deste jeito que a engenharia reversa funciona. Nada é tão simples e a cada passo que dermos, dependendo da complexidade do que investigamos, novos horizontes serão postos em jogo para que possamos inspecioná-los.

Exemplo

Usarei aqui um exemplo de um arquivo criptografado pelo ionCube. Observe o conteúdo:

<?php 
//  foo.class.php
//  Geralmente aqui se encontra algum comentário onde te desencoraja a usar engenharia reversa, decriptografação e outros meios capazes de desencapsular/modificar o conteúdo abaixo.
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
?>
HR+cPwXaWbBeoNPbuTKNSVpZqpN+oAtPNtNjlfYiPCc2mlwAqsXxDbZcfl2K6WO0CHKddChRMfI/
IVNJ83hk6hyzoI47wqPFfbHRgOjZWb1GPYoH173wv83BSp6GlKFvSFTqsomiTXdoA2HhAT9ebTOR
10oyg/f2/IfCZ6IxmOVboj+DrpT4bc47lwUfZejB//SLL02UsJ2Bj4rkkmeAKFNccgQP+/yUmWaZ
/Sk7AqsrFLdhPR3hmn8LsW0MgIqXvg38aL5RRo+CKITc2GjAiKWtDTfstxHvjHzm3QzAohn6E1Vr
pVH9zTUG9eGcUYPhh/8iIRnkwFdbuvtyVL3oWvfgUc+UkxMoiAlKPVld2+3QupSMAfefCJW19oH0
3ObqC3tGraI0zkA+LNnAq6ngbh+GjPlPANSYAf5B4BMj1XCsI2z58EpDilAC+KjvDEiUpf40I8ES
7mVfwLAtQGqTWcDQccA7Q9i2UHzI770hIa2Z3OLOu+Lan8AgKOTOwvkg0gzGj7oJv9VxgglQZBXi
D65kK+jOLiF+uzggyp5GU8XOt553qNc/kxDwda356DIJSVvKbubsy8dm4H4iqMjM61T1ntWSb7HI
/F6eW8A4d/9mSM5NTlD2T8Xa8WoyHv42Ucne73gAy9KG/p5W8dVoT2885eTKLQMHmv1LgcWEr6op
yOh4Qlk8bLV5Y4xVOMx+VPv3kyOJh9v7p2FYxg/mmLgwuW9ec168w5954yee2wVcUwmn+dctdrmH
qwTAvnyeyrMHGti4+RaxA83N4U1Kv5VaeCHHdcgxu5BNo3urgUwexfmW1qD/5PlV3nfX0UiEt819
HR9MX1+VTj9q54jl772sclpA8VBrf+9uIq8kQdT4L4pdPMLbKg0h3+bHohMtp+qF7ANjZFhibySE
kxapXBcpLEI5IDR/6f2v97jWMM/NdOJ2eF9CmBqrDc8xlKyoYX3sqiwe9djDhjZV/9nNjzcp3aTN
y/I3sLfAgRapC0Kx5nrfD2gx0ByBbWNxdXOh2zixCTVH0VxZTNIea9m98fcZdqrq+gf2HJ00KThu
g+Rc84X+Q9qTNy9ZL7KvSXbE6wOX0mYQ6sumw7FctbSa94f+4d9pkQtdrc8klaxWfMwOumkX66cA
7zS2OFWjIL2r7naC9U3vWGDmZkbE0mpr4Ox2Hd/SJKlC2kD524Y+hy9fB1+5DNRQtuh61lEN1pdS
SkomStrIv/5Wo53bOVoyv/h9L+lhofln95Cq9SdnT4KNhuLaBiG4+B1FnzTvAXYnGkgJGaRFRYGZ
wtfdkoJdblh06hyV06Fo5UahTpiPgfmv8sx6N10W4V+QTWJeeD1mLmJY9rGiGSBNV52/WNWHwwxX
DprWWWXy8VS85e/wBJD9RD0F1lr8m8iUMHvCnHQUSBLG3WjrznmtDkeRgmccbOpG40PjMvcLxOxz
5NNoDdORj6122Ki5yrc7yLAgXsOZDYQ+flbExF/2fu23/J1VNGklLB9ot34xW8n+mL6rZDYU9ad0
IxNwkx668/i4WcyHcAk0wOYYwjtfHTJ7QoB3miWgWphCWmspsELboaLzgIno1tF7cBqtPpaG21+T
t5OaIXPoz6TcKOeWEK7vHMQKJi5Y/PIT8sVlHfr7XB5taarmolHahJQQMlMZAJ3KpX1Wr7LDDZHs
8YJIjsAFcL+5ViIpyzYMiV1p4OCIHunKiGUPvyvuZy6Ply4NenyIPdm=

Dada a situação de um código ilegível, vamos aplicar, sequencialmente, algumas das técnicas mostradas acima. No caso,

get_declared_classes()
ReflectionClass()

pois, por inspeção (diretório do arquivo, nome do arquivo, sequenciamento da lógica executada até o ponto, etc) sei que se trata de uma classe e que esta, possivelmente não trabalha sozinha, ou seja, precisa da integração com outras classes nas formas de agregação ou composição.

<?php
	include 'foo.class.php';
	echo '<pre>';
	var_dump(get_declared_classes());

	echo new ReflectionClass('Foo'); // __toString()
?>

Como retorno obteremos

array(133) {
  [0]=>
  string(8) "stdClass"
  [1]=>
  string(9) "Exception"
  [2]=>
  string(14) "ErrorException"
(...)
  [131]=>
  string(13) "XSLTProcessor"
  [132]=>
  string(3) "Foo"
}

/**
     * Foo
     * 
     * Alguma descrição virá aqui
     * Isto é bom
     *
     * @author Alguém
     */
Class [  class Foo implements Bar ] {
  @@ /var/www/html/testes/index.php 14-55

  - Constants [1] {
    Constant [ integer CONSTANTE ] { 5 }
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [2] {
    Property [  private $a ]
    Property [  private $b ]
  }

  - Methods [2] {
    /**
     * teste
     *
     * Esta função faz x, y e resulta em z
     *
     * @return	string
     */
    Method [  public method teste ] {
      @@ /var/www/html/testes/index.php 41 - 43
    }

    /**
     * novo
     *
     * Recebe um inteiro e retorna um bool
     *
     * @params	bool	$param
     * @return	int
     */
    Method [  public method novo ] {
      @@ /var/www/html/testes/index.php 52 - 54

      - Parameters [1] {
        Parameter #0 [  $param ]
      }
    }
  }
}

Vejam que ao chamar as funções de classes definidas, observamos, após a listagem de todas as classes pré-definidas do PHP, uma classe Foo, da qual não temos certeza se é ou não nativa da linguagem.

Inspecionamos com o ReflectionClass e por fim podemos entender um pouco da estrutura daquela classe que inicialmente estava obscura devido ao uso do ionCube.

Conclusão

Vimos então que, pelo menos para o PHP, é possível obter detalhes de implementação independente de como o software foi organizado e seu acesso disponibilizado. Não precisamos essencialmente do acesso direto ao conteúdo lógico e sequencial do arquivo, basta incluí-lo e inspecionar o comportamento de suas classes, funções e variáveis.

Espero que este artigo tenha lhe proporcionado uma luz sobre códigos “obscuros”. Lembre-se que você também pode utilizar estas funções para debugar seu próprio código (que acredito ser a ideia original delas), funcionando como uma ferramenta de apoio para a sequência lógica dos seus programas.

Victor Torres
Victor Torres

É Jedi na DialHost, bacharel em Ciência da Computação e mestrando em Modelagem Matemática e Computacional pelo CEFET. Trabalha com desenvolvimento web desde 2007. Pesquisador de otimização e criptografia, é apreciador de um bom café e fã de histórias futuristas.