Script PHP : Lendo pastas/diretórios recursivamente

março 2nd, 2009 | by DragaO~ |

Olá pessoas felizes :D
onde trabalho atualmente, acabaram tendo um problema lá com “vírus”
sim, isso mesmo que você leu, vírus :D
mas não é um vírus propriamente dito (ao menos eu não vejo assim, mas em todo caso…), invadiram uns servidores FTP’s nossos e acabaram colocando um arquivinho javascript, que quando a pessoa acessava qualquer site, ele (o script javascript) redirecionava a pessoa para um site malicioso, executava algumas coisas (como baixar um arquivo e se auto-executar, por exemplo) e então mostrava o site que a pessoa estava acessando, tudo “normalmente”, sem que o usuário leigo percebesse
pois bem, foi aí que eu entrei em um desses FTP’s e vi que existia o tal arquivinho javascript, mas, não era apenas um, mas um em cada pasta do servidor
Então foi-se lá este ser escamado (e burro :D) renomear arquivo por arquivo para ver se o “vírus” parava de “agir”
mas como a burrice deste ser e a preguiça são coisas que tem quantidades muito parecidas (ok, preguiça vence), este ser pensou sozinho: “porque não crio um script que faça isso pra mim?”
Pois é, parece óbvio, mas como fazer um script que leia todas as pastas recursivamente? :D

estou aqui disponibilizando este script (creio nao precisar explicar sobre ele, pois não é essa a intenção) para caso alguém um dia precise ler “x” pastas/diretórios (independente de quantas exista)

sem mais enrolação, aí vai o código :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?
function a($pasta_pai)
{
    //abre a pasta informada
    $pasta = opendir($pasta_pai);
    //enquanto existirem arquivos/diretorios...
    while(($diretorio = readdir($pasta)) != false)
    {
        //a gente nao quer que ele entre nas pastas ".", pois eh onde ele (o script)
        //se encontra, e nem na pasta acima (".."), pois o PHP nao entende isso
        if($diretorio != "." && $diretorio != "..")
        {
            //verifico se a pasta atual concatenada com o diretorio
            //atual eh uma pasta...
            if(is_dir($pasta_pai . "/" . $diretorio))
            {
                //...se for, chamo novamente esta função passando como
                //parametros a pasta atual e concateno a pasta que quero entrar
                //(lembre-se de utilizar caminhos absolutos para "ajudar" o PHP)
                a($pasta_pai . "/" . $diretorio);
            }
            //aqui tu pode fazer o que bem entender, seja deletar um arquivo (com nome passado por parametro
            //passado na chamada da funçao, obvio), armazenar algo em um ponteiro de array, etc
            //sei lah, ai eh contigo :)
        }
    }
    return 0;
}
 
//chamada da funçao passando como parametro o diretorio atual
a(dirname(__FILE__));
?>

eu sei, sou muito criativo com nomes de funções :)
agora, caso alguem tenha curiosidade em ver o script que eu fiz pro “vírus” (até mesmo porque serve de exemplo), aí vai :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?
function a($pasta_pai, $nome_arquivo)
{
    //abre a pasta informada
    $pasta = opendir($pasta_pai);
    //enquanto existirem arquivos/diretorios...
    while(($diretorio = readdir($pasta)) != false)
    {
        //a gente nao quer que ele entre nas pastas ".", pois eh onde ele (o script)
        //se encontra, e nem na pasta acima (".."), pois o PHP nao entende isso
        if($diretorio != "." && $diretorio != "..")
        {
            //verifico se a pasta atual concatenada com o diretorio
            //atual eh uma pasta...
            if(is_dir($pasta_pai . "/" . $diretorio))
            {
                //...se for, chamo novamente esta função passando como
                //parametros a pasta atual e concateno a pasta que quero entrar
                //(lembre-se de utilizar caminhos absolutos para "ajudar" o PHP)
                a($pasta_pai . "/" . $diretorio, $nome_arquivo);
            }
            //este "else if" eh para o meu problema em si, nao sendo "obrigatorio"
            //para essa funcao funcionar, aqui voces podem fazer o que desejarem
            //(seja lah o que for :D)
            else if(strstr($diretorio, $nome_arquivo))
            {
                //..se nao, caso o diretorio em questao nao seja uma pasta (ou seja.
                //eh um arquivo), e o nome deste arquivo seja o que eu procuro, eu mando
                //deletar ele do sistema de arquivos
                unlink($pasta_pai . "/" . $diretorio);
            }
        }
    }
    return 0;
}
 
//chamada da funçao passando como parametro o diretorio atual e o nome do "virus" :D
a(dirname(__FILE__), "show_gg_ds_17.js");
?>

(hoje acabei por achar um nome “variado” desse “vírus”, o nome do arquivo passou a ser “app_info_next_312.js”, abaixo, uma lista de “virus” :D)
simples não ? :D
o melhor é que executa extremamente rápido, nada como o poder das linguagens script :)

dúvidas? pergunte
sugestões? diga
não se esqueça de dar uma nota à este post, eu agredeço :)

referência das funções :
opendir()“, “readdir()“, is_dir()“, “strstr()“, “unlink()“, “dirname()

referência das constantes pré-definidas:
__FILE__

Tabela de vírus que eu já encontrei:
md5sum – nome do arquivo

  1. 777856d94e29cc565f7afc40c7b408f1 – adv.js
  2. 1d6f45089ce9b7bab0cc28571173d64f – counter13.js

Até a pŕoxima postagem

VN:F [1.4.3_701]
Rating: 8.3/10 (4 votes cast)


Postagens parecidas/interessantes:

  1. 8 Responses to “Script PHP : Lendo pastas/diretórios recursivamente”

  2. By Claiton on mar 2, 2009 | Reply

    Eita garoto inteligente!!!

    Muito boa a tua idéia cara, continua assim que ta no caminho certo!!!
    Eu me amarro nesses scripts que fazem tudo pra gente, e ainda mais com diretório que é fascinante… ‘^^ :D

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  3. By DragaO~ on mar 2, 2009 | Reply

    Obrigado :D
    Eu penso que programação “de verdade” é isso. tu fazer com que a máquina faça as coisas pra ti e que tu perca o mínimo de tempo possível, ainda mais com tarefas repetitivas ou que possuem um padrão
    E além do mais, eu adoro manipular as coisas: manipular arquivos, pastas, sistema operacional e tantas outras coisas; quanto mais dinâmico, melhor :)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  4. By Felipe Torres on mar 4, 2009 | Reply

    Tive serios problemas com isso. Meu servidor foi derrubado por esse motivo.

    Esse script realmente é muito bom.

    Salve um arquivo chamado removespam.php no servidor, e dentro do meu index.php (base das paginas) tem a chamada.

    Agora ta seguro!!!

    qualquer coisa, estou no email.

    Abraço

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  5. By DragaO~ on mar 4, 2009 | Reply

    Obrigado pelo elogio :)
    Pra ser sincero, eu não havia me lembrado de incluí-lo na index.php, juro
    É tão óbvio que parece mentira, mas acredite, eu não havia pensado nisso

    De qualquer maneira, obrigado pela dica, é mais simples do que ficar colocando no servidor e executando (que era o que eu estava fazendo) :D

    Espero que continue acompanhando os posts ;)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  6. By Elton on out 11, 2009 | Reply

    Boa garoto, tive até uma idéia, meio tosca mas, serve para proteger os arquivos, por exemplo.

    1º – ter sempre um arquivo backup compactado ( isso pode ser gerado pelo sistema, fazer uma rotina por exemplo )

    2º – ter uma listagem dos arquivos em disco em formato xml, odf ou mesmo em bd, vale lembrar que, arquivos inseridos por upload, devem ser acrescentados à listagem

    3º – a listagem deve conter também, o hash do arquivo, o hash deve ser atualizado quando atualizar o arquivo

    4º – ao aplicar o “investigador” fazer com que ele verifique se os arquivos estão com o mesmo hash da listagem, se o hash for diferente, exibir um aviso e opção para verificar o conteúdo, se não estiver na listagem, dar a opção para inserir à listagem, apagar o arquivo, ou verificar se é válido

    6º – pode-se também, montar uma listagem on-line desses “vírus”, assim, pode-se disponibilizar como faz a mozilla para todos os browsers.

    Flw.

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  7. By Elton on out 11, 2009 | Reply

    Esqueci

    7º – criar uma rotina para ler esta espésie de “repositórios desnecessários”, “vírus”, “scripts”, “spans”(como melhor entenderem). Após ler esta listagem, o sistema irá excluir sem preguntar, assim como programar o antivírus para excluir determinados arquivos e perguntar sobre outros ou deixar passar alguns, rsrs.

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  8. By DragaO~ on out 20, 2009 | Reply

    Elton: Boa garoto, tive até uma idéia, meio tosca mas, serve para proteger os arquivos, por exemplo.1º – ter sempre um arquivo backup compactado ( isso pode ser gerado pelo sistema, fazer uma rotina por exemplo )2º – ter uma listagem dos arquivos em disco em formato xml, odf ou mesmo em bd, vale lembrar que, arquivos inseridos por upload, devem ser acrescentados à listagem3º – a listagem deve conter também, o hash do arquivo, o hash deve ser atualizado quando atualizar o arquivo4º – ao aplicar o “investigador” fazer com que ele verifique se os arquivos estão com o mesmo hash da listagem, se o hash for diferente, exibir um aviso e opção para verificar o conteúdo, se não estiver na listagem, dar a opção para inserir à listagem, apagar o arquivo, ou verificar se é válido6º – pode-se também, montar uma listagem on-line desses “vírus”, assim, pode-se disponibilizar como faz a mozilla para todos os browsers.

    7º – criar uma rotina para ler esta espésie de “repositórios desnecessários”, “vírus”, “scripts”, “spans”(como melhor entenderem). Após ler esta listagem, o sistema irá excluir sem preguntar, assim como programar o antivírus para excluir determinados arquivos e perguntar sobre outros ou deixar passar alguns, rsrs.

    Flw.

    eu não tinha pensado exatamente nisso, mas já tinha pensado em algo desse tipo :D

    o que eu tinha pensado foi como tu comentou no 7, de criar um repositório e tal, mas achei isso trabalhoso demais XD
    além disso, “infelizmente” (?) não tenho mais acesso à servidores “bichados”, por isso fica difícil de eu atualizar essa lista; mas obviamente se alguém me mandasse algo eu atualizaria a lista sem problemas :)

    mas as tuas idéias de 1-6 são muito boas, acho que, dependendo do caso, fica viável implementá-las mesmo

    Quote

    VN:F [1.4.3_701]
    Rating: 3.0/5 (1 vote cast)
  1. 1 Trackback(s)

  2. mai 17, 2009: Blog do DragaO~ » Blog Archive » PHP : Extraindo arquivos zipados

Deixe um comentário

Vai postar algum código? Leia isso antes