Stratégie de protection des codes sources.

Eléphanteau du PHP | 20 Messages

24 mars 2011, 15:00

Bonjour à tous,

Je compte déployer mes développements PHP sur un hébergement mutualisé. J'ai passé énormément de temps à développer. Le projet sur lequel je travaille est très important à mes yeux, et je ne voudrais pas que l'on s'approprie mon travail.

J'ai des doutes sur le professionnalisme des salariés employés par le service d'hébergement. Il leur serait très facile de copier le fruit de mon travail, dans la mesure où ils sont administrateurs des serveurs.

QUESTION 1:

Avez-vous connaissance de tels agissements de la part de salariés peu scrupuleux?

QUESTION 2 :

J'envisage "d'offusquer" le code PHP de mon projet. Connaissez-vous un outil offuscateur de code PHP Open Source?

Je précise les points suivants :
  • J'utilise PHP 5.3.
  • Je ne cherche pas nécessairement à optimiser mon code. Si, en plus l'outil effectue une optimisation, c'est mieux. Mais l'objectif principal est l'offuscation.
  • Je connais des outils qui feraient l'affaire (ioncude ou Zend Guard). Mais ces outils ne sont pas donnés! Et je n'ai pas besoin de la fonction d'optimisation du code.
Je vous remercie d'avance.

Denis

ViPHP
ViPHP | 2577 Messages

24 mars 2011, 15:19

Bonjour,

Je doute qu'il existe un produit opensource pour cacher du source. Ca me semble plutôt antinomique.

Pour ce qui est du pompage des sources, vu le nombre de sites probablement hébergé, il n'y a pas un risque énorme. Il faudrait que ton site soit très populaire pour qu'il envisage de regarder les sources. Si cela devient le cas, il est probable que tu seras passer à une solution dédiée d'hébergement.

Eléphanteau du PHP | 20 Messages

24 mars 2011, 16:15

Bonjour,

Je doute qu'il existe un produit opensource pour cacher du source. Ca me semble plutôt antinomique.

Pour ce qui est du pompage des sources, vu le nombre de sites probablement hébergé, il n'y a pas un risque énorme. Il faudrait que ton site soit très populaire pour qu'il envisage de regarder les sources. Si cela devient le cas, il est probable que tu seras passer à une solution dédiée d'hébergement.
Salut Mazarini,

Effectivement, les risques sont faibles.

Pour information, j'ai envisagé une solution simple pour limiter les risques :
  • Éliminer tous les commentaires présents dans les codes PHP. Un petit script Perl pour réaliser cette opération n'est pas bien compliqué. Ça rend le code moins attractif :wink:
  • Déposer un droit d'auteur sur l'ensemble du code. Le coût de cette opération est de 7 euros, et cela prend 5 minutes sur Copyright France (http://www.copyright-france.com). Puis je rajouterais au début de tous les fichiers PHP un commentaire pour dire que ce code a fait l'objet d'un dépôt de droit d'auteur, en spécifiant le lien direct vers le certificat électronique du dépôt. Cela devrait être dissuasif.
Remarque : Je suis conscient que mon code n'a rien d'extraordinaire. Je cherche plus à protéger mon projet que mon code... Pour monter ce projet, et surtout pour développer le site, j'ai consacré énormément de temps. Le principal obstacle à la création de ce genre de projet est justement le temps passé à le développer, dans la mesure où il n'existe pas d'outils vraiment adaptés. Le temps (ou le coût) est donc le principal obstacle à la concurrence. Aussi je ne veux pas découvrir qu'un concurrent me fait de l'ombre alors qu'il s'est tout simplement contenté de copier mon code...

Cordialement,

Denis

ViPHP
ViPHP | 5462 Messages

24 mars 2011, 17:16

regarde du coté de bcompiler

Eléphanteau du PHP | 20 Messages

24 mars 2011, 18:17

regarde du coté de bcompiler
Salut Stealth35,

Je te remercie beaucoup pour ton intervention. "BCompiler" est exactement le type de solution que je recherchais. Je vais me faire la main sur l'outil.

Cordialement,

Denis

Eléphanteau du PHP | 20 Messages

24 mars 2011, 18:36

Salut à tous,

Je reviens pour ajouter un peu d'information au sujet.

L'extension "Bcompiler" n'est pas incluse par défaut dans PHP. Il faut l'installer séparément. Cette opération ne pose pas de problème particulier sous Linux.

L'extension "Bcompiler" est indispensable pour créer les fichiers "binaires" (.phb). Par contre, je ne sais pas si elle est également indispensable pour exécuter les fichiers binaires préalablement créés. Si c'est le cas, cette solution n'est vraisemblablement pas envisageable dans le cadre d'un hébergement dédié. Je vais effectuer un test. Je vous donnerais le résultat du test.

Cordialement,

Denis

ViPHP
ViPHP | 5462 Messages

24 mars 2011, 19:06

sous windows elle est dispo ici : http://downloads.php.net/pierre/

devlop78
Invité n'ayant pas de compte PHPfrance

24 mars 2011, 20:07

Je ne sais pas trop ce que valent ces outils. APC_CACHE, bcompiler.

En plus de la protection des sources, il peut être intéressant de "compiler" pour accélerer l'exécution (ce que j'appelle "éviter bêtement de réinterpréter"). APC serait capable de le faire en fournissant de l'OPcode mais dans les exemples que j'ai pu voir, on y met des variables, enfin du cache quoi ...

Peut-être que l'ouverture d'un post serait plus approprié, mais de tous ces outils, est-il possible de regrouper plusieurs de dizaines de fichiers php en un seul, sous forme "compilée" ou pré-compilée. J'ai aussi pensé à réunir tous les fichiers en un (une sorte de cache), mais (ça peut être intéressant d'essayer), je ne suis pas sûr que ce soit plus intéressant que une dizaine d'include, voir plusieurs dizaines sur ... plusieurs dizaines ^^.

ViPHP
ViPHP | 5462 Messages

24 mars 2011, 22:15

si tu veux tout en un seul fichier et compressé (mais pas compilé, mais sans doute possible avec APC) regarde du coté de phar

devlop78
Invité n'ayant pas de compte PHPfrance

25 mars 2011, 03:40

La compression ne risque-t-elle pas de ralentir l'application ? Le but serait quand même de gagner du temps car mon projet est quasi un framework, et les include ne manquent pas ...

Eléphanteau du PHP | 20 Messages

25 mars 2011, 11:58

Bonjour à tous,

Je vous remercie pour toutes les informations que vous m'avez apportées. L'application Phar semble "vraiment" très intéressante. Le point qui a particulièrement retenu mon attention est le suivant (http://www.php.net/manual/fr/intro.phar.php):
Le format de fichier "phar" est unique et dédié à l'extension "phar" et peut être créé uniquement par celle-ci ou par le paquet PEAR "PHP_Archive", mais a l'avantage de ne pas nécessiter l'installation de l'extension "phar" pour que l'application empaquetée puisse être exécutée.

En d'autres mots, même avec l'extension phar désactivée, il est possible d'exécuter ou d'inclure une archive basée sur "phar". Accéder à des fichiers individuels au sein d'une archive phar n'est possible qu'avec l'extension phar à moins que l'archive phar n'ait été créée par "PHP_Archive".
Ce point est particulièrement important si l'on se place dans le contexte d'un hébergement mutualisé caractérisé par le fait qu'il est impossible d'ajouter des modules à PHP.

Je vais explorer cette solution.

En ce qui concerne l'offuscation, j'ai trouvé une piste :

http://www.phpclasses.org/package/2610- ... tions.html

Il semble que l'écriture d'un offuscateur n'est pas très difficile en utilisant le "tokenizer" (http://www.php.net/manual/fr/intro.tokenizer.php).

Cette solution me semble suffisante, dans la mesure où mon objectif est de protéger mon projet, et non mon code. Je m'explique :

Une faible offuscation ne constitue pas une protection inviolable. Elle rend toutefois le code (très) difficile à comprendre, à maintenir, et à faire évoluer. Or, si la quantité de travail nécessaire à la reprise d'un code est supérieure à la quantité de travail nécessaire à sa réécriture totale, alors l'opération n'est pas rentable.

Cordialement,

Denis

Eléphanteau du PHP | 20 Messages

11 avr. 2011, 14:02

Bonjour à tous,

Je reviens pour vous fournir un code qui pourra, je l'espère, être utile à quelqu'un.

Le script PHP ci-dessous effectue les opérations suivantes :
  • Il parcourt la totalité d'un répertoire donné à la recherche de fichiers PHP.
  • Pour chaque fichier PHP trouvé, le script effectue les opérations suivantes : Il retire tous les commentaires, il réduit les espaces inutiles et il ajoute un avertissement en tête du fichier.
Les fichiers traités ne sont pas remplacés. Le script crée une nouvelle arborescence sous un répertoire dont le chemin est passé en paramètre.

Script principal :

Code : Tout sélectionner

<?php require_once 'libs/parsers.php'; require_once 'libs/fs.php'; // Analyse de la ligne de commande. $shortopts = 'f:t:c:'; $longopts = array('from:', 'to:', 'copyright::'); $options = getopt($shortopts, $longopts); if (FALSE === $options) { echo "ERROR: Invalid command line!\n"; exit (1); } if (!array_key_exists('f', $options) && !array_key_exists('from', $options)) { echo "ERROR: Missing mandatory option --from/-f\n"; exit (1); } if (!array_key_exists('t', $options) && !array_key_exists('to', $options)) { echo "ERROR: Missing mandatory option --to/-t\n"; exit (1); } $copyright = null; $argvSourcePath = array_key_exists('f', $options) ? $options['f'] : $options['from']; $argvTargetPath = array_key_exists('t', $options) ? $options['t'] : $options['to']; if (array_key_exists('c', $options) || array_key_exists('copyright', $options)) { $file = array_key_exists('c', $options) ? $options['c'] : $options['copyright']; $copyright = file_get_contents($file); if (FALSE === $copyright) { echo "ERROR: Could not load file <file>\n"; exit (1); } } // Extraction de tous les fichiers de l'arborescence et traitement des fichiers PHP. $pathes = find($argvSourcePath); foreach ($pathes as $path) { $relativePath = getDirPrefix($argvSourcePath, $path); $targetBaseName = basename($path); $targetFullPath = $argvTargetPath . DIRECTORY_SEPARATOR . $relativePath; $targetDirName = dirname($targetFullPath); // On crée le répertoire de destination, si ce dernier n'existe pas déjà. if (file_exists($targetDirName)) { if (! is_dir($targetDirName)) { echo "ERROR: <$targetDirName> exists and is not a directory!\n"; exit(1); } } else { if (FALSE === mkdir($targetDirName, 0777, true)) { echo "ERROR: Could not create directory <$targetDirName>!\n"; exit(1); } } echo "[$argvSourcePath" . DIRECTORY_SEPARATOR . "] $relativePath => "; echo "[$argvTargetPath" . DIRECTORY_SEPARATOR . "] $relativePath\n"; // Si le fichier n'est pas un fichier PHP, on se contente de la copier. if (! preg_match('/\.php$/i', $path)) { if (file_exists($targetFullPath)) { if (FALSE === unlink($targetFullPath)) { echo "ERROR: Could not delete file <$targetFullPath>\n"; }; } if (FALSE === copy($path, $targetFullPath)) { echo "ERROR: Could not copy <$path> into <$targetFullPath>\n"; exit(1); } continue; } // Si le fichier est un fichier PHP, alors on le modifie. $php = obfuscate($path); // $php = stripComments($path); if (FALSE === $php) { echo "ERROR: Error while processing file <$path>!\n"; exit(1); } // Si un fichier de droit d'auteur a été défini, alors on ajoute la mention relative au droit d'auteur. if (! is_null($copyright)) { $php = '<?php /* ' . $copyright . " */?>\n" . $php; } if (FALSE === file_put_contents($targetFullPath, $php)) { echo "ERROR: Error creating file <$targetFullPath>!\n"; exit(1); } } exit(0); function help() { echo "Usage: php copyright.php --from=<source directory> -to=<target directory> [--copyright=<path to the file that contains the copyright>]\n"; } function getDirPrefix($inSourceTopDir, $inPath) { $prefix = substr($inPath, strlen($inSourceTopDir)); $first = substr($prefix, 0, 1); if (DIRECTORY_SEPARATOR == $first) { $prefix = substr($prefix, 1); } return $prefix; } function chompPath($inPath) { $lastChar = substr($inPath, -1); if (DIRECTORY_SEPARATOR == $lastChar) { return substr($inPath, 0, strlen($inPath)-1); } return $inPath; } ?>
Librairies :

Code : Tout sélectionner

<?php // fs.php function find($inPath) { $entries = array(); // Tableau qui contient la liste de toutes les entrées trouvées. $dir = null; // Référence vers le répertoire ouvert. $dir = opendir($inPath); if (FALSE === $dir) { return FALSE; } // Pour chaque entrée du répertoire. while (($entry = readdir($dir)) !== FALSE) { if ($entry != '.' && $entry != '..' && is_dir($inPath . DIRECTORY_SEPARATOR . $entry)) { $entries = array_merge($entries, find($inPath . DIRECTORY_SEPARATOR . $entry)); } elseif ($entry != '.' && $entry != '..') { $entries[] = $inPath . DIRECTORY_SEPARATOR . $entry; } } closedir($dir); return $entries; } ?>

Code : Tout sélectionner

<?php // parsers.pgp if (!defined('T_ML_COMMENT')) { define('T_ML_COMMENT', T_COMMENT); } else { define('T_DOC_COMMENT', T_ML_COMMENT); } function obfuscate($inPath) { $source = file_get_contents($inPath); if (FALSE === $source) { return FALSE; } $tokens = token_get_all($source); $php = ''; foreach ($tokens as $token) { // Un point virugule... if (is_string($token)) { $php .= $token; continue; } // Ce n'est pas du texte simple. list($id, $text) = $token; switch ($id) { case T_COMMENT: case T_ML_COMMENT: case T_DOC_COMMENT: break; case T_WHITESPACE: $php .= ' '; break; default: $php .= $text; } } return $php; } function getClassesNames($inPath) { $nextIsClassName = FALSE; $source = file_get_contents($inPath); if (FALSE === $source) { return FALSE; } $tokens = token_get_all($source); foreach ($tokens as $token) { if (is_string($token)) { continue; } list($id, $text) = $token; switch ($id) { case T_CLASS: $nextIsClassName = TRUE; break; case T_STRING: if ($nextIsClassName) { $nextIsClassName = FALSE; echo "$text\n"; }; } } } ?>
A+

Eléphant du PHP | 422 Messages

11 avr. 2011, 16:37

hello

il fallait coder avec des whitespaces :)

http://fr.wikipedia.org/wiki/Whitespace

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

devlop78
Invité n'ayant pas de compte PHPfrance

11 avr. 2011, 17:10

Héhé ...

Eléphant du PHP | 422 Messages

12 avr. 2011, 18:10

hello

voila juste pour la rigolade ^^ une classe qui vire les retours chariots, les tabulations, les commentaires et fait un md5 des variables.
On passe à la classe le dossier source et php s'occupe de tout ! (on espère en croisant les doigts :mrgreen: )
<?php
/*

class obf by telnes
allows obfuscation of php code
2011
*/



class obf { 
    
    private $salt;    
    private $destination;
	private $excludeVariable;	

	//folder : string dir 
	//destination : string destination dir
    public function __construct($folder,$destination='') { 
	    
    $folderArray = array();
   	$this->salt = 'azerty12'; // use for concat in the md5 var creation
   	$this->destination = '_obf'; // destination folder
   	
   	//add more ! 
   	$this->excludeVariable = array('$_ENV','$_SESSION','$_FILES','$_GLOBALS','$_POST','$_COOKIE','$_GET','$_SERVER','$_REQUEST','$this');
   	
   	$GLOBALS['excludeVariable'] = $this->excludeVariable;
   	$GLOBALS['salt'] = $this->salt;
   	
   	//if destination is empty use default destination
   	if(!empty($destination)){
	 	$this->createDir($destination);
		$this->destination = $destination;   
	}
	else{
	 	$this->createDir($this->destination);
	}
   	
		if(is_dir($folder)){
		 
			$folderArray = $this->readFolderRecursive($folder); 
			foreach($folderArray as $fileOrDir){
				$fileContents = '';
				 
			 	//if file > obfuscation
			 	if(is_file($fileOrDir)){
			 	 	
			 	 	//if php file /!\ phpx !!
			 	 	if(substr($fileOrDir,-3,3) == 'php'){
				 		echo 'file : '.htmlentities($fileOrDir)."<br />\n";
				 	
				 		//delete comments and \n\r\t
					 	$fileContents = $this->clearWhite($fileOrDir);
					 	
					 	if(empty($fileContents)){
							echo 'WARNING : file '.$fileOrDir.' empty'."<br />\n";
							$fileContents = file_get_contents($fileOrDir);
						} 
					 	
					 	//obfuscation with md5 value of var
					 	$fileContents = $this->replaceVariable($fileContents);
					 	
					 	//write the file
					 	$this->writeFile($this->destination.'/'.$fileOrDir,$fileContents);
					}
					else{
					 	echo 'copy of '.$fileOrDir. ': not php file'."<br \>\n"; 
					 	copy($fileOrDir,$this->destination.'/'.$fileOrDir);
					 	
					}	
			 	}
			 	//else create dir
			 	else{
			 	 	echo 'folder : '.htmlentities($fileOrDir).'<br />';
			 	 	$this->createDir($this->destination.'/'.$fileOrDir);
			 	}
			}
		
		}
		else{
		 
		 	exit(htmlentities($folder).' not a directory !');
		}    	

    }  

	//replace all variable withe an md5+salt value
	private function replaceVariable($content){
	 
	 	//  \$([a-zA-Z0-9_-]{1,})

		return preg_replace_callback(
			'@\$[a-zA-Z0-9_]{1,}@',
            create_function(
	            '$matches',
	            'return (!in_array($matches[0],$GLOBALS[\'excludeVariable\']))?\'$_\'.md5($GLOBALS[\'salt\'].$matches[0]):$matches[0];'
        	),
            $content);
			 
	}
	
	private function replaceFunction(){
	 
		//    function([ ]{0,})([a-zA-Z0-9]{1,})([ ]{0,})()
		
		
	}
	
	private function clearWhite($file){
		
	    return php_strip_whitespace($file);
	}

	//return an array of folders / files
	private function readFolderRecursive($dir){

		$path = '';
		$stack[] = $dir;
	   	while ($stack) {
	       	$thisdir = array_pop($stack);
	       	if ($dircont = scandir($thisdir)) {
	           	$i=0;
	           	while (isset($dircont[$i])) {
	               	if ($dircont[$i] !== '.' && $dircont[$i] !== '..') {
	                   	$current_file = "{$thisdir}/{$dircont[$i]}";
	                   	if (is_file($current_file)) {
	                       	$path['file'][] = "{$thisdir}/{$dircont[$i]}";
	                   	} elseif (is_dir($current_file)) {
	                        $path['dir'][] = "{$thisdir}/{$dircont[$i]}";
	                       	$stack[] = $current_file;
	                   	}
	               	}
	               	$i++;
	           	}
	       	}
	   	}
	   	return array_merge($path['dir'],$path['file']);	 

	}
	
	private function createDir($folder){
		if(!is_dir($folder)){
			if (!mkdir($folder,'0777',true)) {
	    		echo 'WARNING : fail to create directory '.htmlentities($folder).'<br />';
			}			 
		}
		else{
		 	
			echo 'WARNING : directory '.htmlentities($folder).' already exist <br />';
		}
	}
	
	private function writeFile($file,$content){

		$fp = fopen($file, 'w');
		fwrite($fp, $content);
		fclose($fp);	  	
	}

    public function __destruct() { 
     
    } 
 } 

?>
ce qui donne, si on passe cette classe à la moulinette

<?php
 class obf { private $_28345e3d5632f4d45e73b4fae8c3973f; private $_c9e7d6069e1feebaf6bccdd4a4405746; private $_7ed951f79d7612868947d83832b81def; public function __construct($_e6a558eaad6e84cb12ecdab511b0b650,$_c9e7d6069e1feebaf6bccdd4a4405746='') { $_24aba973b4f5311906a6d6d07e0a004f = array(); $this->salt = 'azerty12'; $this->destination = '_obf'; $this->excludeVariable = array('$_ENV','$_SESSION','$_FILES','$GLOBALS','$_POST','$_COOKIE','$_GET','$_SERVER','$_REQUEST','$this'); $GLOBALS['excludeVariable'] = $this->excludeVariable; $GLOBALS['salt'] = $this->salt; if(!empty($_c9e7d6069e1feebaf6bccdd4a4405746)){ $this->createDir($_c9e7d6069e1feebaf6bccdd4a4405746); $this->destination = $_c9e7d6069e1feebaf6bccdd4a4405746; } else{ $this->createDir($this->destination); } if(is_dir($_e6a558eaad6e84cb12ecdab511b0b650)){ $_24aba973b4f5311906a6d6d07e0a004f = $this->readFolderRecursive($_e6a558eaad6e84cb12ecdab511b0b650); foreach($_24aba973b4f5311906a6d6d07e0a004f as $_a73d8d03e67e1c793b132a4ca6c79950){ $_76ff0955120a4b4e2076131813480c3f = ''; if(is_file($_a73d8d03e67e1c793b132a4ca6c79950)){ if(substr($_a73d8d03e67e1c793b132a4ca6c79950,-3,3) == 'php'){ echo 'file : '.htmlentities($_a73d8d03e67e1c793b132a4ca6c79950)."<br />\n"; $_76ff0955120a4b4e2076131813480c3f = $this->clearWhite($_a73d8d03e67e1c793b132a4ca6c79950); if(empty($_76ff0955120a4b4e2076131813480c3f)){ echo 'WARNING : file '.$_a73d8d03e67e1c793b132a4ca6c79950.' empty'."<br />\n"; $_76ff0955120a4b4e2076131813480c3f = file_get_contents($_a73d8d03e67e1c793b132a4ca6c79950); } $_76ff0955120a4b4e2076131813480c3f = $this->replaceVariable($_76ff0955120a4b4e2076131813480c3f); $this->writeFile($this->destination.'/'.$_a73d8d03e67e1c793b132a4ca6c79950,$_76ff0955120a4b4e2076131813480c3f); } else{ echo 'copy of '.$_a73d8d03e67e1c793b132a4ca6c79950. ': not php file'."<br \>\n"; copy($_a73d8d03e67e1c793b132a4ca6c79950,$this->destination.'/'.$_a73d8d03e67e1c793b132a4ca6c79950); } } else{ echo 'folder : '.htmlentities($_a73d8d03e67e1c793b132a4ca6c79950).'<br />'; $this->createDir($this->destination.'/'.$_a73d8d03e67e1c793b132a4ca6c79950); } } } else{ exit(htmlentities($_e6a558eaad6e84cb12ecdab511b0b650).' not a directory !'); } } private function replaceVariable($_e0d598363c77ae7497436ea0d0217703){ return preg_replace_callback( '@\$[a-zA-Z0-9_]{1,}@', create_function( '$_2e9ad0296af6084f37712caf3796fb5b', 'return (!in_array($_2e9ad0296af6084f37712caf3796fb5b[0],$GLOBALS[\'excludeVariable\']))?\'$_d4db6e508a499269444c224b2255e099\'.md5($GLOBALS[\'salt\'].$_2e9ad0296af6084f37712caf3796fb5b[0]):$_2e9ad0296af6084f37712caf3796fb5b[0];' ), $_e0d598363c77ae7497436ea0d0217703); } private function replaceFunction(){ } private function clearWhite($_826189c87813751b6bb27fe17be3f06c){ return php_strip_whitespace($_826189c87813751b6bb27fe17be3f06c); } private function readFolderRecursive($_67c3a450c461eaf60e6a656624352742){ $_d5cfedb026579d93e773975b3bdb51b0 = ''; $_dd575262a041d41f683707d03b93898b[] = $_67c3a450c461eaf60e6a656624352742; while ($_dd575262a041d41f683707d03b93898b) { $_f399d22c0fb72c37f331ba6e3642b28a = array_pop($_dd575262a041d41f683707d03b93898b); if ($_2b7aaf92cce4964c526db37fca95745b = scandir($_f399d22c0fb72c37f331ba6e3642b28a)) { $_cccb617c311af27e60db184e1e9c59ab=0; while (isset($_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab])) { if ($_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab] !== '.' && $_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab] !== '..') { $_bc05decc23c7cf58fec4b8b77b6f86a8 = "{$_f399d22c0fb72c37f331ba6e3642b28a}/{$_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab]}"; if (is_file($_bc05decc23c7cf58fec4b8b77b6f86a8)) { $_d5cfedb026579d93e773975b3bdb51b0['file'][] = "{$_f399d22c0fb72c37f331ba6e3642b28a}/{$_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab]}"; } elseif (is_dir($_bc05decc23c7cf58fec4b8b77b6f86a8)) { $_d5cfedb026579d93e773975b3bdb51b0['dir'][] = "{$_f399d22c0fb72c37f331ba6e3642b28a}/{$_2b7aaf92cce4964c526db37fca95745b[$_cccb617c311af27e60db184e1e9c59ab]}"; $_dd575262a041d41f683707d03b93898b[] = $_bc05decc23c7cf58fec4b8b77b6f86a8; } } $_cccb617c311af27e60db184e1e9c59ab++; } } } return array_merge($_d5cfedb026579d93e773975b3bdb51b0['dir'],$_d5cfedb026579d93e773975b3bdb51b0['file']); } private function createDir($_e6a558eaad6e84cb12ecdab511b0b650){ if(!is_dir($_e6a558eaad6e84cb12ecdab511b0b650)){ if (!mkdir($_e6a558eaad6e84cb12ecdab511b0b650,'0777',true)) { echo 'WARNING : fail to create directory '.htmlentities($_e6a558eaad6e84cb12ecdab511b0b650).'<br />'; } } else{ echo 'WARNING : directory '.htmlentities($_e6a558eaad6e84cb12ecdab511b0b650).' already exist <br />'; } } private function writeFile($_826189c87813751b6bb27fe17be3f06c,$_e0d598363c77ae7497436ea0d0217703){ $_0c84fc90833311fe485c6647e15c4dbb = fopen($_826189c87813751b6bb27fe17be3f06c, 'w'); fwrite($_0c84fc90833311fe485c6647e15c4dbb, $_e0d598363c77ae7497436ea0d0217703); fclose($_0c84fc90833311fe485c6647e15c4dbb); } public function __destruct() { } } ?>
ce qui est bien crade :mrgreen:

enjoy the veb
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)