Protéger ses scripts PHP

Si vous développez des applications web en PHP vous avez sûrement 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. Sources et explications fournies :

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. Je n’ai pas non plus testé cette méthode en profondeur, il y a sûrement plein de cas où elle n’est pas applicable, n’hésitez pas à poster des commentaires à ce sujet.

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{dEn58wjIBToFUtb9>gL}=kqeZ0RuD[4lz Om<12PyHSWJGp7MaiVQr/cN]h63x\",\" kCV]4m.DNvM>lstIKLBE6}ghf8[QAowPSR9ibX3cO{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.

9 commentaires ↓

#1 Jean on 06.11.07 at 21:52

protéger des scripts c’est bien mais est-il possible de protéger une charte graphique ?

#2 Stéphane on 06.12.07 at 13:28

Du moment qu’un fichier est disponible en ligne, rien n’empêche qu’il soit téléchargé. Une charte graphique n’est pas comme un script, on ne peut pas la compiler ou la brouiller, la seule protection qui soit possible pour ce type de contenu est d’ordre juridique.

#3 lo.j on 09.26.07 at 13:57

pour info: la version presentée dans JDN contient des erreurs.

#4 Stéphane on 09.26.07 at 20:22

Pouvez-vous m’en dire un peu plus ? Quelle est cette erreur et est-elle aussi présente sur ce billet ?

#5 Chris on 10.04.07 at 14:11

Il y a en fait deux erreurs dans le script disponible dans JDN. Les voici :

echo <’?php ‘.$enc.’ ?>’;
echo ‘</textarea>’;</p>

Je vous laisse les chercher, elles sont relativement simples à trouver ;-)

Je n’ai pas vu d’erreur dans votre script en tout cas.

#6 Stéphane on 10.04.07 at 20:42

Comme quoi, le copier-coller n’est pas si simple :)

#7 Zied on 12.30.07 at 1:09

Je pense que la meilleur solution est d’utilser un encodeur pro tels que Zend Guard (ou Zend Encoder), IconCube, etc.
On peut également utiliser gratuitement l’extension bcompiler de php.

#8 Ed on 01.30.12 at 20:54

Moi je prefere PHPshadow parce ce que pour 5 euros on peut encoder tant qu’on vent pendant 48 heures.

#9 Stéphane on 01.31.12 at 9:19

PHPshadow est un obfuscateur qui se base sur une extension à installer sur le serveur pour pouvoir exécuter (décoder) le code ce qui n’est pas toujours possible, par exemple, la majorité des hébergements mutualisés ne permettent pas d’installer une extension autre que celles approuvées par l’hébergeur. Par contre le fait de passer par une extension rend un peu plus sûr le codage, ça sera plus dur à décoder si on veut obtenir les sources du fichier d’origine.

Laisser un commentaire