Muitos desenvolvedores PHP precisam proteger seu código-fonte quando o distribuem para os clientes, a fim de minimizar as chances de seu trabalho ser alterado ou copiado sem permissão.
Leia este artigo para saber mais sobre as soluções de proteção de código-fonte PHP em geral, e como o pacote PackApp pode ajudar a proteger o seu código-fonte PHP.
Introdução
Desenvolvedores PHP têm que encarar o problema da proteção de sua propriedade intelectual após a entrega do produto ao cliente. A EULA (End User License Agreement) ou uma licença proprietária fornece proteção legal, mas realmente não vai impedir o uso não autorizado do software.
Compilar ou codificar o código-fonte pode eliminar o problema, mas impõe requisitos para o servidor do cliente para que o código compilado possa ser executado.
Usar o modelo SaaS pode ser outra solução, mas requer que o suporte do servidor do fornecedor esteja disponível 24/7.
No entanto, quando o produto é para ser instalado no servidor do cliente, normalmente ele fornece um ambiente padrão como o LAMP baseado em pilha. Este artigo discute como proteger uma aplicação PHP nesse caso.
Técnicas
A aplicação PHP no servidor do cliente precisa de dois tipos de proteção:
- Impedir a leitura e modificação do código-fonte do aplicativo
- impedir a redistribuição de todo o aplicativo
A primeira medida para tornar o código fonte mais difícil de ler é a “minimização”. Remover comentários, espaços em branco e quebras de linha reduz significativamente a legibilidade. No entanto, não é um problema escrever um pequeno script para reformatar o código minificado para torná-lo legível. Os nomes de identificadores mnemônicos são ainda informativos o suficiente para entender o código com algum esforço.
Outra medida que pode ajudar aqui é ofuscação. Renomear os identificadores com valores ocasionais torna o código fonte muito difícil de entender, alterar ou usar.
O código-fonte minificado e ofuscado ainda pode ser copiado e instalado em outro servidor qualquer. Assim, a aplicação deve ser bloqueada para o site do cliente a fim de impedir a redistribuição. Existem várias opções para o bloqueio do código-fonte usando: endereço IP do servidor, nome de domínio do site, URL específica, endereço de hardware (MAC). A aplicação deve incluir funcionalidades necessárias para verificar os critérios de bloqueio antes de realizar qualquer ação.
Soluções
Há muitos minificadores, ofuscadores e codificadores por aí. Alguns codificadores comerciais são muito bons, mas muito caros e podem exigir extensões do sistema. As outras soluções podem utilizar algoritmos muito triviais ou estarem limitadas apenas a uma única fonte.
Há minificadores que se aproveitam das funções de tokenizer do PHP baseados na estrutura de parse dos valores do token no código-fonte. O código-fonte é reconstruído retirando os comentários e os espaços em branco.
O código-fonte minificado precisa ser embaralhado, o que pode ser feito pela codificação ou ofuscamento. O método de codificação mais simples é aplicar base64_encode() e eval() ao código-fonte inalterado ou usar alguma criptografia. Mas também é fácil para qualquer programador PHP competente decodificar esse script para ver o código-fonte.
A maneira mais confiável para construir um ofuscador leve é analisar o código-fonte lexicalmente, substituir os identificadores com nomes sem sentido, e depois reconstruir o código-fonte PHP. Isso deve ser feito em todos os arquivos do código-fonte, incluindo também os templates. Portanto, muitas ferramentas online não são adequadas para essa finalidade, pois processam somente scripts individuais.
Soluções com base em criptografia e descriptografia têm outros problemas. Ferramentas de ótima qualidade, como Zend Guard, SourceGuardian ou ionCube, usam métodos de codificação mais sofisticados. No entanto, além do custo dessas soluções comerciais, elas exigem uma extensão do PHP geralmente chamada de Loader. Diferentes versões do Loader são fornecidas de acordo com o servidor web, mas os clientes podem não querer (ou não poder) instalá-las.
Os codificadores podem ter características de bloqueio opcionais. O código de bloqueio é construído na fonte codificada e a verificação é feita durante a execução. Mais uma vez, um programador competente pode localizar esse código e eliminar a verificação de bloqueio.
PackApp.php
O PHP Application Packer preenche a lacuna entre ofuscadores simples e ferramentas de ótima qualidade. Para esse pacote, empacotar significa minificar, ofuscar, e comprimir com ZIP.
PackApp.php empacota os arquivos do projeto: minifica a fonte (HTML, CSS, JavaScript, JSON, PHP, XML), ofusca o código (JavaScript, PHP) e comprime os arquivos resultantes. O código-fonte pode ser um único arquivo ou uma pasta que pode ter sub-pastas. O resultado é um arquivo empacotado ou uma pasta com os arquivos compactados. Os arquivos ZIP são tratados também: pasta-para-zip, zip-para-pasta, zip-to-zip.
Você pode testar a demonstração de arquivo único aqui.
Características e benefícios principais:
- Empacota um projeto inteiro de uma só vez
- Adequado para projetos de back-end e de front-end
- Processa diferentes tipos de fonte e incorporação (embedding)
- Minificação e ofuscação são separados
- Leve e compatível, já que é escrito em PHP
- Extensões do sistema e codificação não são necessárias
Uma interface de usuário baseada na Web é fornecida para controlar o processo de empacotamento com várias opções.
O PackApp pode ser chamado também de um script PHP, conforme explicado nesta página de descrição.
A instalação do PackApp inclui o registro que liga o pacote ao diretório web do cliente. Isso poderia ser um padrão para sua própria solução de bloqueio.
O próprio código-fonte do pacote está minificado e ofuscado – tentar desfazer isso! Você pode obter a versão completa do PackApp neste link.
Conclusão
Então, assim como um bloqueio não impedirá outros de entrarem em sua casa, o ofuscamento não vai impedir que outros usem o seu código, só vai tornar isso mais difícil para eles. O objetivo do pacote PackApp é fazer com que a engenharia reversa seja bastante cara para se tentar.
Às vezes é suficiente minificar, às vezes a ofuscação é necessária para alcançar a necessária proteção, ou o bloqueio deve ser aplicado. A escolha depende da aplicação e do modelo de negócio.
O uso de qualquer solução gratuita muitas vezes não é satisfatório. Parece ser muito a pagar pelo utilitário, então, provavelmente, o código-fonte não precisa de proteção.
Se você está procurando pela proteção completa, então você deve estar pronto para pagar 10 vezes mais (talvez anualmente), e seu cliente deve estar pronto para instalar extensões no servidor web. Na maioria dos casos, uma solução intermediária como PackApp é adequada para muitos fornecedores de software independentes.
***
Vallo Reima faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://www.phpclasses.org/blog/package/9574/post/1-PHP-Source-Code-Protection-Solutions.html