Voila je vois pas mal de personne qui subisse des hack alors je vous fille un ptit script que je suis entrain de developé pour mon panel admin sur mutu ( attention c'est pas très propre pour le moment on pourrai appeler ça une alpha )
donc crée 2 fichier dans un meme dossier : conf.guardian.php et guardian.php
guardian.php contient :
Code PHP:
namespace gardian;
class DirectoriesAutoloaderException extends \Exception {
}
class ExtensionFilterIteratorDecorator extends \FilterIterator {
private $_ext = array();
public function accept() {
foreach ($this->_ext as $ext) {
if (substr($this->current(), -1 * strlen($ext)) === $ext) {
return is_readable($this->current());
}
return false;
}
}
public function setExtension($pExt) {
$this->_ext[] = $pExt;
}
}
class guardian {
private function __construct() {
}
private static $_instance = false;
public static function instance($pTmpPath = '') {
if (self::$_instance === false) {
self::$_instance = new guardian();
self::$_instance->setConfPath($pTmpPath);
self::$_instance->getConf();
}
return self::$_instance;
}
private $_conf;
private $_crcarray;
public function getConf() {
if (file_exists($this->_ConfPath . 'conf.guardian.php')) {
include $this->_ConfPath . 'conf.guardian.php';
$this->_conf = $conf;
foreach ($conf['dir'] as $dir => $recurcive) {
$this->addDirectory($dir,$recurcive);
}
if(isset($crc) and is_array($crc)){
$this->_cacheload = 1;
$this->_crcarray = $crc;
}
}
}
private $_ConfPath;
public function setConfPath($pTmp) {
$this->_ConfPath = $pTmp;
}
public function get_crc($file) {
$file_string = file_get_contents($file);
$crc = crc32($file_string);
return sprintf("%u", $crc);
}
public function addDirectory($pDirectory, $pRecursive = true) {
if (!is_readable($pDirectory)) {
throw new DirectoriesAutoloaderException('Cannot read from [' . $pDirectory . ']');
}
$this->_directories[$pDirectory] = $pRecursive ? true : false;
return $this;
}
private $_directories = array();
public function save() {
$this->_getfilelist();
$toSave = ". var_export($this->_conf, true) . "; \n \$crc = " . var_export($this->_f, true) . ";\n ?>";
if (file_put_contents($this->_ConfPath . 'conf.guardian.php', $toSave) === false) {
throw new DirectoriesAutoloaderException('Cannot write cache file ' . $this->_ConfPath . 'conf.guardian.php');
}
}
private $_cacheload = 0;
public function checkall() {
if ($this->_cacheload == "1") {
$this->_getfilelist();
foreach ($this->_f as $md5 => $info) {
if ($info[0] != $this->_crcarray[$md5][0]) {
$file_info = stat($info[1]);
echo 'la signature du fichier : ' . $info[1] . ' n\'est pas valide ( newsign :' .$info[0].' , last modif : ' . date('d/m/Y', $file_info[9]) . ")
\n";
}
}
} else {
$this->save();
echo 'initialisation ok';
}
}
private function _getfilelist() {
foreach ($this->_directories as $directory => $recursive) {
$directories = new \AppendIterator ();
if ($recursive) {
$directories->append(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory)));
} else {
$directories->append(new \DirectoryIterator($directory));
}
$files = new ExtensionFilterIteratorDecorator($directories);
$files->setExtension('.php');
foreach ($files as $fileName) {
$this->_f[md5($fileName)] = array($this->get_crc($fileName), strtolower($fileName));
}
}
}
private $_f = array();
}
guardian::instance()->checkall();
?>
conf.guardian.php c'est le fichier de sauvegarde de crc et des dossier a surveiller :
ex :
je veut que tout les dossier et sous dossier de www/forum soit surveillier
et que les fichier de www2/ le soit aussi mais sans les sous dossier je taperai alors dans conf.guardian.php
Code PHP:
$conf=array (
'dir' =>
array (
'/homez.xxx/yyy/www/forum' => '1',
'/homez.xxx/yyy/www2/' => '0',
),
);
?>
pour l'utilisation une fois les 2 fichier dans sur votre serveur vous allez sur guardian.php
vous devrai voir initialisation ok. les crc ( signatures ) des fichiers sont enregistrés
si vous accédé encore sur guardian.php vous verrez tous les fichiers modifié depuis l'initialisation,
je vous conseille de faire une copie du fichier conf.guardian.php que le hackeur ne le supprime pas ça serré dommage
je suis encore entrain de le coder mais la version final ( avec un cron qui envoi un mail si il y a du changement et la version avec interface graphique serons publier en même temps que mon panel )
au niveau perf le script scan 404 fichiers en 0,9s