Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Salvando a pele do Programador php - Uploads de arquivos indevidos
Colaboração: Altemir Braz Dantas Junior
Data de Publicação: 03 de março de 2011
Seguindo a mesma linha da dica Salvando a pele do Programador php - SQL Injection.
Então vamos lá. Primeiramente crie um arquivo php contendo as seguintes linhas:
ex: security.php
/*
aqui vai varrer todos FILES (variavel responsavel por arquivos) e jogar
o o nome do arquivo para a funcao verifica_extensao
*/
foreach ($_FILES as $f){
foreach($f as $index=>$valor){
if($index == 'name'){
verifica_extensao($valor);
}
}
}
function verifica_extensao($var){
//aqui um array de todas as extensoes proibidas para upload
$proibidas['extensoes'] = array('php', 'phps', 'exe','bat','msi','asp','js');
//pega a extensao em minusculo
$extensao = strtolower(end(explode('.',$var)));
$existe = in_array($extensao, $proibidas['extensoes']);
if ($existe) {
echo "< script>alert('Erro: Extensão Proibida!');history.go(-1);</script>";
exit;
}
}
Agora é só dar um include desse arquivo na lib principal ou em todos os arquivos php que fazem upload.
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
04 Mar 2011, 12:47
Tudo depende do servidor onde estiver rodando e de como é configurado e dependendo de como o site é programado, tudo pode virar uma falha.
O apache reconhe os arquivos com scripts pela extensao e não pelo content-type, e os executáveis devem se restringir à área cgi-bin.
E ainda, um script php ou qualquer outra linguagem pode estar em um arquivo de content-type text/plain. Ou ainda, podemos maquiar um script dentro de um arquivo com extensão qualquer e content-type mascarado também.. se o usuário é avançado, tudo é mascarável.
Aliás, já vi casos em que é feito o upload de arquivos de imagem do tipo 'foto.gif.php' onde os primeiros bytes do arquivo são "GIFxx;<?php ... ?> ", justamente pra conseguir acesso a servidores que só verificam o content-type e não verificam a extensão do arquivo
Mais informação em:
http://www.phpclasses.org/blog/post/67-PHP-security-exploit-with-GIF-images.html
http://birdhouse.org/blog/2007/06/19/php-inside-image-files/
04 Mar 2011, 09:49
O mais correto na minha opinião, seria filtrar via content-type, pegando o mesmo via mime_content_type (depreciada já) ou utilizando a extensão PECL Fileinfo (http://www.php.net/manual/en/ref.fileinfo.php).
03 Mar 2011, 12:43
03 Mar 2011, 11:28
03 Mar 2011, 02:31
03 Mar 2011, 02:29
Por exemplo: o arquivo "infectado.php" seria salvo no sistema de arquivos como 123456 e o nome registro em uma tabela no banco de dados. O que permitiria manter o nome original para o arquivo, e salva-lo no servidor sem risco de servir a propósitos indesejados.
Na hora de fazer o download, usar os headers apropriados para retornar o nome original ao arquivo:
header('Content-Disposition: attachment; filename="infectado.php"');
echo file_get_contents('123456');




