Assurer la protection de ses scripts PHP

Présentation d'un mécanisme visant à empêcher la copie sauvage des développements réalisés dans le langage de script Open Source, avec sources et explications à l'appui.

Si vous développez des applications Web en PHP vous avez surement déjà eu besoin de protéger vos scripts contre les modifications. Si vous ne voulez pas, par exemple, qu'un client utilise votre travail sur plusieurs sites alors que vous lui avez permis d'utiliser votre script que sur un seul site. Voici un moyen simple et relativement efficace d'empêcher la copie sauvage.

Encoder ses scripts

L'encodage permet de rendre illisible le code source d'un script sans en changer son comportement, le script encodé continuera de s'exécuter comme avant. Il y a tout de même une contrainte : votre script doit entièrement être en PHP, pas de mélange PHP + HTML dans le même fichier.

Fonctionnement de l'encodage

Le principe est assez simple : On commence par lire entièrement le fichier à encoder et on enlève les balises <?php et ?>, normalement il n'y en a que deux, une au début et une à la fin du fichier.

Ensuite on fait un simple encodage en base 64 du script, on mélange le tout en utilisant une table de correspondances et c'est tout.

Enfin presque, il ne nous reste plus qu'a ajouter le décodeur et à enregistrer le tout dans un autre fichier. Le décodeur fait l'opération inverse : il remet les données dans le bon ordre, applique un base_64decode() et lance le script grâce à un eval()

Voila le code de l'encodeur, il vous affiche le script encodé à la fin dans un textarea pour pouvoir le copier-coller facilement.

 $nom_fichier = 'mon_script_a_encoder.php';
 

$fichier = trim(file_get_contents($nom_fichier));
$fichier = preg_replace("/^<\?(php)?/", '', $fichier);

$fichier = preg_replace("/\?>$/", '', $fichier);
  
echo '<h1>Encodage</h1>';

echo '<p>Nom : '.$nom_fichier.'</p>';
 
$b64 = base64_encode($fichier);

echo '<p>Base 64 : '.$b64.'</p>';
 
$tr = strtr($b64, " kCV]4m.DNvM>lstIKLBE6}ghf8
[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT<5yZYd",
"ACv.sfKXY{dEn58wjIBToFUtb9>gL}=kqeZ0RuD[4lz
Om<12PyHSWJGp7MaiVQr/cN]h63x");

echo '<p>Translation : '.$tr.'</p>';
 
$enc = "\$__c='".$tr."';";

$enc .= "\$__s=strtr(\$__c,\"ACv.sfKXY{dEn58wjI
BToFUtb9>gL}=kqeZ0RuD[4lz Om<12PyHSWJGp7MaiVQr/
cN]h63x\",\" kCV]4m.DNvM>lstIKLBE6}ghf8[QAowPSR9i
bX3cO{up=0anq27jF1eJx/UWGrzHT<5yZYd\");";

$enc .= '$__d=strrev("edoced_46esab");eval(\'$__
x=$__d("$__s");\');eval($__x);';
 
echo '<h1>Résultat</h1>';

echo '<textarea cols="100" rows="10">';
echo '<?php '.$enc.' ?>';

echo '</textarea>';

Le mot de la fin

Vous avez vu que ce procédé est assez simple, il ne tiendra pas longtemps face à un vrai développeur mais devrait suffire dans la plupart des cas.

Vous pouvez aussi vous amuser avec pobs pour obfusquer vos scripts ou si vous prévoyez une plus large diffusion vous devrez peut-être utiliser un encodeur plus évolué (bien plus) du genre de Zend Guard ou ionCube PHP encoder.

Contenu réalisé sous licence Creativ Commons par Stéphane Brunw