Меня попросили написать простенькую лечилку…
<?php
class iframeScanner
{
/**
* Необходимо передать путь до директории с которой надо начинать лечить
* @param $directory
*/
public function __construct($directory)
{
$this->directory = $directory;
}
/**
* Сканирование.
* Просто собирается со всех страниц информация о содержащихся в них iframe
* @return array список файлов с iframe и сам iframe
*/
public function scan ()
{
$this->directoryLength = strlen($this->directory);
$fileSPLObjects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($this->directory),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach($fileSPLObjects as $fullFileName => $fileSPLObject) {
if(preg_match('~\.'.$this->ignoreExts.'~', $fullFileName) or $fileSPLObject->isDir()) {
continue;
}
$this->fullFilesCount++;
$this->fileContent = file_get_contents($fullFileName);
$position = strpos($this->fileContent, '<iframe');
if($position !== false) {
$pf = preg_match_all('~<iframe src=\"(.*?)\".*?</iframe>~s', $this->fileContent, $matches);
if(!$pf) {
continue;
}
$shortFileName = substr($fullFileName, $this->directoryLength);
$this->infectionFilesCount++;
$this->resultList[] = array(
'full_path' => $fullFileName,
'short_path' => $shortFileName,
'iframe' => $matches[0],
'src' => $matches[1]
);
}
}
return $this->resultList;
}
/**
* Лечилка.
* Те iframe которые были найдены с помощью scan() будут удалены
* @return int выводит кол-во удаленных iframe
*/
public function cure () {
$count = 0;
foreach($this->resultList as $file) {
$fileContent = file_get_contents($file['full_path']);
$fileContent = str_replace($file['iframe'], '', $fileContent);
file_put_contents($file['full_path'], $fileContent);
$count++;
}
return $count;
}
public
$directory = '',
$directoryLength = 0,
$ignoreExts = '(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)',
$fullFilesCount = 0,
$infectionFilesCount = 0,
$fileContent = '',
$resultList = array();
}
?>
Сканирование на наличие iframe:
<?php
$scan = new iframeScanner(realpath(dirname(__FILE__).'/..'));
$scanFiles = $scan->scan();
echo '<table width="100%">';
foreach($scanFiles as $k => $iframe) {
echo '<tr><td>'.++$k.'</td>';
echo '<td>'.$iframe['short_path'].'</td>';
echo '<td><ol>';
foreach($iframe['src'] as $src) {
echo '<li>'.$src.'</li>';
}
echo '</ol></td></tr>';
}
echo '</table>';
if($scan->infectionFilesCount == 0) {
echo '<div>Зараженных файлов не найдено!</div>';
}
echo '
<div>
Просканировано: '.$scan->fullFilesCount.'<br />
Зараженных: '.$scan->infectionFilesCount.'
</div>';
if($scan->infectionFilesCount != 0) {
echo '<h2><a href="?cure">Вылечить!</a></h2>';
}
?>
Лечение и вывод результатов лечения:
<?php
$scan = new iframeScanner(realpath(dirname(__FILE__).'/..'));
$scanFiles = $scan->scan();
$cure = $scan->cure();
if($cure) {
echo '<div>Вылечил! ('.$cure.')</div>';
} else {
echo '<div>Лечить нечего… :(</div>';
}
?>
При необходимости можете расширить функционал, написав дополнительные проверки в scan().