Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

Arquivos "fantasmas" sendo incluídos via autoload

Recommended Posts

Fala galera,

 

Estou com uma situação inusitada. Criei uma intranet para um cliente meu, e em ambiente de testes na Locaweb, funcionou perfeitamente. Ao fazer o upload dos arquivos no servidor do cliente, diversos arquivos estão sendo detectados pelo "autoload.php", porém, eles não existem, e como acabam não sendo encontrados, o código retorna erro nos includes.

 

 

Warning: include() [function.include]: Failed opening 'D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\56o208.php' for inclusion (include_path='c:\php5.3fastcgi\dev;c:\php5.3fastcgi\ext;c:\php5.3fastcgi\extras;c:\php5.3fastcgi\extras\pdf-related;.') in D:\Domains\intranet.XXXX.com.br\wwwroot\common\autoload.php on line 19

 

Eu vi que ele buscou diversos arquivos que sequer os vi na vida, haha. Criei um array pra eles, e fiz uma condicional para que caso fossem "procurados", ignorá-los.

$arrayExclusao = array("56o208","5liel2s03vkz52","_dbo_0i","miae0a","avr09kce","df_uqadyp0o5h","0u3de5zp","wgo3s","b_l5qk","xa97c_","bu8m3v","zt_z97z9lp","t_0","38_lz4qv","xwok","g2ahydo","72a5","5hcibvljfet","xl58p","_xlka","ewjmn","d_xhwrc");

Porém, periodicamente, esta lista aumenta. Do nada aparecem novos arquivos sendo procurados, e tenho que abrir o código e inserir o arquivo neste array acima.

 

Já viram algo parecido? Será que são arquivos ocultos no servidor? Alguma lib do servidor está solicitando a inclusão destes, e como não existem, dá o erro?

 

Cogitei até vulnerabilidade ou invasão, mas isso ocorreu logo após o upload dos arquivos no servidor... nem daria tempo! hahahaha

 

Segue abaixo o código completo do autoload.

<?php

	define( "CLASS_DIR", __DIR__.DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR );

	spl_autoload_register(function($class){

		$className = CLASS_DIR.str_replace("\\", DIRECTORY_SEPARATOR, $class).".php";
		
		$arrayExclusao = array("56o208","5liel2s03vkz52","_dbo_0i","miae0a","avr09kce","df_uqadyp0o5h","0u3de5zp","wgo3s","b_l5qk","xa97c_","bu8m3v","zt_z97z9lp","t_0","38_lz4qv","xwok","g2ahydo","72a5","5hcibvljfet","xl58p","_xlka","ewjmn","d_xhwrc");

		if(!in_array($class,$arrayExclusao)){
			include($className);
		}
		
	});

	if( $handle = opendir( CLASS_DIR ) ){
		while( false !== ( $file = readdir( $handle ) ) ){
			if( !is_dir( $file ) && $file != ".DS_Store" ){
				$arrayClasses[] = str_replace( ".php", "", $file);
        	}
		}
		closedir( $handle );
	}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala @AndersonMamede, obrigado pelo retorno!

Printei o backtrace conforme sugeriu e retornou o seguinte:

 

 

#0 require_once() called at [D:\Domains\intranet.XXXX.com.br\wwwroot\common\config.php:16]

#1 require_once(D:\Domains\intranet.XXXX.com.br\wwwroot\common\config.php) called at [D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\modulo\usuario.php:11]

 

Ou seja, as inclusões citadas não aparecem no backtrace.

 

Questionei os includes no servidor e o atendimento da hospedagem me tratou como se eu fosse um iniciante, mandando eu revisar linha por linha de tudo, pois meu site poderia estar sendo invadido. Engraçado que só acontece no servidor dele, mas... não deixo de considerar nada, só não sei por onde começar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta utilizar também a função get_included_files para ver se tem algo anormal (bem no final do script... tipo no rodapé mesmo, para pegar qualquer coisa).

 

Outra coisa que você pode fazer é verificar se algum arquivo no sistema/site que faz referência à esses arquivos. Eu tenho uma função que pesquisa por uma string em uma pasta (e subpastas), tente utilizar e veja se acha algo aí...

<?php
function getFileList(&$rsFiles, $path, $targetExt = "php", $exceptionFolders = Array(), $recursive = true){
    if(!is_array($rsFiles)){
        $rsFiles = Array("0-folders" => Array(), "1-files" => Array());
    }
    
    $files = scandir($path);
    
    foreach($files as $file){
        if($file == "." || $file == ".." || in_array($file, $exceptionFolders)){
            continue;
        }
        
        $fullPath = $path."/".$file;
        if(is_dir($fullPath)){
            $rsFiles["0-folders"][$fullPath] = $file;
            if($recursive){
                getFileList($rsFiles, $fullPath, $targetExt, $exceptionFolders, $recursive);
            }
        }else if($targetExt === "*" || preg_match("/\.".$targetExt."$/", $file)){
            $rsFiles["1-files"][$fullPath] = $file;
        }
    }
}
 
function searchInFiles($path, $findMe, $caseSensitive = false, $targetExt = "php", $exceptionFolders = Array(), $deepSearch = true){
    $filesFound = Array();
    
    if(!$caseSensitive){
        $findMe = strToLower($findMe);
    }
    
    $files = Array();
    getFileList($files, $path, $targetExt, $exceptionFolders, $deepSearch);
    $files = $files["1-files"];
    
    foreach($files as $file => $fileName){
        $fileContent = file_get_contents($file);
        
        if(!$caseSensitive){
            $fileContent = strToLower($fileContent);
        }
        
        if(strpos($fileContent, $findMe) !== false){
            $filesFound[] = $file;
        }
    }
    
    return $filesFound;
}
 
// em $folder você coloca caminho da pasta raíz do sistema/site
// onde será iniciado a busca (também é buscado nas subpastas)
$folder = "";
 
// tenta procurar pelo nome dos arquivos, ou então as palavras include/require e veja o que encontra...
$text = "56o208";
 
$files = searchInFiles($folder, $text, false, "*");
 
echo "<pre>";
print_r($files);
die();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em teoria, um autoload somente busca um arquivo caso ele esteja sendo chamado. Está utilizando alguma forma de cache ou alguma biblioteca que use cache (Template, etc..)?

 

Caso estiver utilizando o projeto em conformidade com a PSR-4 (ou ao menos PSR-0) sugiro utilizar o autoload do próprio composer.

http://forum.imasters.com.br/topic/537233-problema-com-autoload-simples/?p=2145510

 

Quando for rodar em produção, utilize o comando abaixo para otimizar o autoload:

composer install --optimize-autoloader

Será criado um class map somente com as classes existentes no projeto (arquivos reais) e passará a ignorar as referências.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala @Anderson,

 

Executei o get_include_files, e retornou somente os includes que eu realmente configurei.

D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\modulo\usuario.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\config.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\autoload.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\function\essential.php
D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\verify.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Agenda.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Query.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Config.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Cliente.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Conteudo.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\ConteudoSecao.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Download.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Email.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Evento.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Funcao.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Imagem.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\ImagemObra.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Log.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Menu.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Noticia.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Obra.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\ObraUsuario.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Secao.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Setor.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\Usuario.php
D:\Domains\intranet.XXXX.com.br\wwwroot\common\class\UsuarioNoticia.php
D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\head.php
D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\header.php
D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\sidebar.php
D:\Domains\intranet.XXXX.com.br\wwwroot\sistema\foot.php

@Gabriel,

 

Eu rodo esse comando no terminal? Como ele faz referência ao servidor onde está hospedado? Eu até hoje me embanano muito nesses autoloaders do composer, me parecem que todo lugar que vejo tutoriais é como se eu tivesse acesso completo ao servidor, sendo que 100% das vezes que uso, são hospedagens compartilhadas. Pra mim, ainda é muito complicado usar isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O comando deve ser rodado no terminal do servidor. Não precisa ter permissões especiais, apenas que o servidor possa se conectar externamente.

 

Dependendo do servidor, você deve acessar via telnet. A maioria dos servidores atuais fornecem acesso ao shell (de forma limitada) e é mais que o suficiente.

 

Você instalará o composer, que não é nada mais que baixar o composer.phar, e executará o comando. Se instalar o composer de forma local, você utilizará:

php composer.phar install --optimize-autoloader

Caso for de forma global, será:

composer install --optimize-autoloader

Caso você não tiver acesso ao shell existe a opção "não ortodoxa". Faça toda a configuração localmente e copie a pasta vendor para o servidor. Irá funcionar também, pois, o autoload utiliza o root do projeto de forma dinâmica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.