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
- 777856d94e29cc565f7afc40c7b408f1 – adv.js
- 1d6f45089ce9b7bab0cc28571173d64f – counter13.js
Até a pŕoxima postagem
8 Responses to “Script PHP : Lendo pastas/diretórios recursivamente”
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
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
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
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
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
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
By DragaO~ on out 20, 2009 | Reply
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