Verificar arquivos zip dentro de outro zip.[RESOLVIDO]

6 respostas
Wiliam_Witter

Boa tarde, bom vou explicar tudo desde o começo, eu precisava fazer um codigo q não permitisse ser anexado arquivos (.exe) nem mesmo ele estando compactado com zip ou rar, até ai eu fiz mais a pegada é o seguinte se o usuario pega um (.exe) zipa ele e depois coloca esse arquivo zipado dentro de outro zip ai meu codigo não axa.

ai vai minhas linhas de codigo para vc's darem uma olhada

private boolean validarArquivo(byte[] array, String fileName){
    	String ext = fileName.contains(".")? fileName.substring(fileName.lastIndexOf(".")+1):"";
    	

    	if(ext.equalsIgnoreCase("exe")){
    		addErrorMsg("Arquivo não anexado ao catálogo. O sistema não permite que arquivos com extensão (.exe) seja anexado.");
    		return false;
    	}
    	if(ext.equalsIgnoreCase("zip")){//caso arquivo compactado com WinZip

    		try{
    			File f = new File(fileName);
    			OutputStream os = new FileOutputStream(f);
    			os.write(array);
    			os.flush();

    			ZipFile zf = new ZipFile(f);

    			Enumeration entries = zf.entries();

    			while(entries.hasMoreElements()){
    				String str = ((ZipEntry)entries.nextElement()).getName();
    				String extensao = str.contains(".") ? str.substring(str.lastIndexOf(".")+1):"";
    				if(extensao.equalsIgnoreCase("exe")){
    					addErrorMsg("Arquivo não anexado ao catálogo. O sistema não permite que arquivos com extensão (.exe) seja anexado.");
    					return false;
    				}
    				if(extensao.equalsIgnoreCase("zip")){
    					insertionSort(array, str);
    				}
    			}
    			f.delete();
    		}catch(FileNotFoundException e){
    			addErrorMsg("Arquivo não encontrado.");
    		}
    		catch(IOException e){
    			addErrorMsg("Erro ao ler o arquivo.");
    			e.printStackTrace();
    		}
    	}
    	else if(ext.equalsIgnoreCase("rar"))//caso arquivo compactado com WinRar
    	{
    		
    		try {
    			File f = new File(fileName);
    			OutputStream os = new FileOutputStream(f);
    			os.write(array);
    			os.flush();
    			Archive archive = new Archive(f);

    			for (FileHeader fileHeader : archive.getFileHeaders()){
    				String str = fileHeader.getFileNameString();
    				String extensao = str.contains(".") ? str.substring(str.lastIndexOf(".")+1):"";
    				if(extensao.equalsIgnoreCase("exe")){
    					addErrorMsg("Arquivo não anexado ao catálogo. O sistema não permite que arquivos com extensão (.exe) seja anexado.");
    					return false;
    				}
    			}

    			f.delete();
    		}

    		catch (RarException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			addErrorMsg("Erro ao ler o arquivo.");
    			e.printStackTrace();
    		}

    	}
    	return true;
    }

axo q seria mais ou menos a mesma coisa ou seja esse metodo chamando ele mesmo, mais não sei como fazer isso, alguem tem alguma idéia.
obrigado.

6 Respostas

Leandro_Vecchi

Olha, eu vi um pessoal com esse mesmo problema, vou tentar descobrir o que eles fizeram.

Wiliam_Witter

mais alguém???

M

Uma alternativa é impedir que o usuário coloque um zip dentro do seu zip. Quando fizer a verificação para ver se não tem nenhum “exe”, verifique também se não tem nenhum “zip”, ou “rar” e por aí vai…

Isso não seria uma solução?

Wiliam_Witter

Bom dia marcobiscaro2112 intão eu pensei nessa ipotese também, mais eu estava querendo tipo um codigo redundante por exemplo esse metodo xamando ele mesm, me informaram que é possivel fazer mais esta muito complicado não estou conseguindo. intão se ninguém tiver mais idéias terei q apelar para essa idéia mesmo, bloquear envio de arquivos q tiver um zip dentro de outro…

valeu a idéia obrigado.

Marcelo_FS
private boolean validarArquivo(byte[] array, String fileName){
   String extensao = fileName.substring(fileName.lastIndexOf(".")+1);
   if(extensao.equalsIgnoreCase("exe"))
      return false;
   else 
      if(extensao.equalsIgnoreCase("zip"))
         return validarZip(array, fileName);
      else 
         if(extensao.equalsIgnoreCase("rar"))
            return validarRar(array, fileName);
   return true;
}

private boolean validarZip(byte[] array, String fileName){
   File file = this.criaArquivo(array, fileName);
   ZipFile zip = new ZipFile(file);
   Enumeration entries = zip.entries();
   while(entries.hasMoreElements()){
      String name = ((ZipEntry) entries.nextElement()).getName();
      // ao invés de passar o array, tem que descompactar o zip e passar o conteúdo do arquivo
      byte[] conteudoDoArquivo = null; // isso é com vc :P
      if(!this.validarArquivo(conteudoDoArquivo, name)
         return false; // algum arquivo dentro é .exe
   }
   return true;
}

private boolean validarRar(byte[] array, String fileName){
   File file = this.criaArquivo(array, fileName);
   Archive archive = new Archive(file);
   for(FileHeader header : archive.getFileHeaders()) {
      String name = header.getFileNameString();
      // ao invés de passar o array, tem que descompactar o zip e passar o conteúdo do arquivo
      byte[] conteudoDoArquivo = null; // isso é com vc :P
      if(!this.validarArquivo(conteudoDoArquivo, name)) 
         return false;
   }
   return true;
}

private File criaArquivo(byte[] array, String fileName) {
   File file = new File(fileName);
   OutputStream output = new FileOutputStream(file);
   output.write(array);
   output.flush();
   output.close();
   return file;
}

Não testei o código (fiz aqui no fórum mesmo), mas a princípio é isso aí…

“To understand recursion, you must first understand recursion” :wink:

Wiliam_Witter

Era isso ai mesmo, fiquei desde ontem pesquisando isso… valeu Marcelo Brigado.

Criado 22 de dezembro de 2008
Ultima resposta 23 de dez. de 2008
Respostas 6
Participantes 4