Upload de arquivos de forma seguro com PHP [RESOLVIDO]

1. Upload de arquivos de forma seguro com PHP [RESOLVIDO]

Paulo Camboim
paulocamboim

(usa Slackware)

Enviado em 19/08/2010 - 12:07h

Olá pessoal,

Gostaria de saber qual a forma mais segura de fazer uploads de arquivos, para evitar problemas como upload de código malicioso.

O problema é que o upload pode ser qualquer tipo de arquivo. Ou seja, posso enviar um arquivo PHP, então não adiantaria ver o mime-type do arquivo(como da pra fazer quando é APENAS imagem). O que quero é evitar que esse script enviado seja executado, dando acesso a uma shell-php por exemplo. Porém preciso que o arquivo fique disponível para download.

Para isso só consegui colocando permissão 777 - gravação(Salvar o arquivo) , leitura(Para exibir o arquivo) e execução(para fazer o download). Mas isso deixa brecha para um usuário mal intencionado executar algum código.

Como faria esse controle?

desde já, agradeço a atenção.

Paulo


  


2. Re: Upload de arquivos de forma seguro com PHP [RESOLVIDO]

Paulo Camboim
paulocamboim

(usa Slackware)

Enviado em 19/08/2010 - 13:35h

É o 7 da permissão é leitura, gravação e execução

Mas por exemplo se eu colocar a permissão como 6 = leitura e gravação
E tentar dar um wget no arquivo olhe a resposta que tenho:
HTTP request sent, awaiting response... 403 Forbidden

Não sei porque ... Por isso disse q coloquei permissão total...


3. Re: Upload de arquivos de forma seguro com PHP [RESOLVIDO]

Paulo Camboim
paulocamboim

(usa Slackware)

Enviado em 19/08/2010 - 15:00h

Não sei se é a melhor solução, mas segue o que fiz

1. Primeiro
Criei um arquivo .htaccess dentro da pasta que recebe os arquivos de upload, com o seguinte código

RewriteEngine on
# Nao deixa acesso a nenhum arquivo, evitando execucao de codigo malicioso pelo usuario
RewriteRule .(\.*)$ ../index.php

Ou seja, caso o usuário tente acessar um arquivo diretamente, ele é redirecionado para a página principal. Mas pode surgir um outro problema, como que o usuário vai baixar um arquivo? Pois se você digitar o link completo vai voltar pra index.

2. Segundo
Eu criei um arquivo chamado getDownload.php que basicamente é:

// caminho absoluto para a pasta onde esta o seu site
$localPath = "/srv/httpd/sua_pagina/";

// nome do arquivo na pasta de uplo
$arquivo = "nome-unico-do-arquivo-salvo-na-pasta-de-upload";

// caminho absoluto + nome do arquivo
$localFile = $localPath."/upload/".$arquivo;

// Configuramos os headers que serao enviados para o browser
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="nome-original-do-arquivo"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($localFile) );
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');

// Envia o arquivo para o cliente
readfile($localFile);


Pronto, feito isso aparentemente ta tudo ok.
Alguma sugestão ?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts