Journal du Net > Développeur > PHP >  PHP > Pratiques > Protéger ses scripts PHP
Pratique
 
25/09/2007

Protéger ses scripts PHP

Comment éviter de voir son code PHP copié par d'autres sites ? L'une des méthodes possibles consiste à chiffrer la source. Voici un petit programme pour exécuter cette commande.
  Envoyer Imprimer  

 
En savoir plus
 
 
 

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.

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.

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'à 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=0anq27j
F1eJx/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>';</p>

 
En savoir plus
 
 
 

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 proposé sous licence Creativ Commons par Stéphane Brun


JDN Développeur Envoyer Imprimer Haut de page

Sondage

Adobe parviendra-t-il à percer avec sa nouvelle suite de création Web Edge ?

Tous les sondages