Récemment, j'ai commencé à évaluer les options possibles pour protéger la propriété intellectuelle dans les librairies PHP distribuées, plus particulièrement dans les applications web. Évidemment, on n'a pas à avoir de souci quand on héberge les projets sur nos propres serveurs mais il vient un temps où certains clients souhaitent déménager leur projet chez un autre hébergeur et c'est là qu'on sent la nécessité de protéger certaines portions critiques contre les gens mal intentionnés (vol de code, espionnage industriel, ingénierie inversée / reverse engineering). On met des efforts pendant des mois, parfois des années à développer et paufiner des mécanismes et des processus intelligents, il est normal de vouloir protéger notre savoir. Comme PHP est un langage interprété (non compilé), et que le code peut être lu et décortiqué facilement par des programmeurs, on est aussi bien de leur compliquer la vie un peu!
Lors de mes recherches, j'ai retenu deux possibilités : Zend Guard (basé sur la notoriété de Zend, c'est celui que j'ai testé) et IonCube (efficace et un peu moins cher).
Zend Guard, successeur de Zend Encoder, permet de prendre un projet, le sélectionner dans son ensemble ou en partie et de convertir les instructions PHP en un code intermédiaire illisible par un être humain normalement constitué. Ce code, obfusqué et encodé, pourra ensuite être lu, compris et exécuté par Zend Optimizer, un gratuiciel qui doit être installé sur le serveur qui héberge le projet.
Pour appliquer simplement la protection à un projet, suivez les instructions suivantes :
- Menu File / New / Zend Guard Project
- Entrez le nom du projet et le chemin où les fichiers de configuration seront conservés
- Indiquez le nom du produit (comme s'il s'agissait d'une application web) et la version
- Spécifiez l'emplacement où vous voulez déposer les fichiers une fois encodés
- À l'étape suivante, choisissez le répertoire où sont placés les fichiers sources PHP (racine)
- Pour des fins de tests, terminez en utilisant les options par défaut
Dans la fenêtre Guard Explorer (normalement à gauche, elle ressemble à un explorateur de fichiers) :
- Sélectionner les fichiers et répertoires à exclure, ouvrez le menu contextuel avec le bouton droit de la souris et choisissez l'option "Exclude resource"
- En ouvrant le menu contextuel sur le nom du projet (racine de l'explorateur de fichiers), cliquez sur "Encode Project"
Dans le répertoire que vous avez spécifié plus tôt, vous retrouverez les fichiers encodés. Vous pourrez vérifier que les fichiers choisis ont bien été transformés en les ouvrant avec votre éditeur préféré. Vous ne devriez plus reconnaître les portions PHP. Ceux exclus demeureront intacts.
Pour terminer, il ne restera qu'à transférer les fichiers sur le serveur en utilisant un client FTP. À l'exécution du code, si vous voyez apparaître une erreur du type "Fatal error: Unable to read xxx bytes in chemin-du-fichier on line 0", c'est que vous n'avez pas transféré les fichiers encodés dans le bon mode. Forcez votre client FTP à utiliser le mode binaire (par exemple dans Filezilla : Menu Transfert / Mode de transfert / Binaire).
Le soucis, c'est que le cryptage est hyper facile à faire sauter :(