Conheça o Plugfeed | » Início » Programação » PHP » Upload de Imagens Com Segurança
Conheça o Plugfeed | » Início » Programação » PHP » Upload de Imagens Com Segurança -->
 
Avaliação: | Publicado em: 13/11/2006
Upload de Imagens Com Segurança
Alfred Reinold Baudisch Desenvolvedor web freelance, com atuação na área há 7 anos. Experiência avançada em PHP, SQL e modelagem de sistemas multi-camadas. Atualmente dedicado ao aprendizado em desenvolvimento mobile, especificamente mobile games, com J2ME. Apaixonado e conhecedor do mercado financeiro, gestão e estratégias de novos negócios, visão constantemente empreendedora.
Upload de Imagens Com Segurança

Imagine o caso de algum site seu, onde você possibilita aos usuários postarem imagens. E no script você simplesmente faz o upload sem nenhuma verificação do arquivo enviado.

Isso realmente não é nada bom. Veja nesse artigo, como verificar o tipo de arquivo postado, seu tamanho e dimensões da imagem, verificando assim, totalmente as imagens postadas.
Baixe o código-fonte ao final do artigo!

Iniciamos criando a página com o formulário de envio da imagem.
Usaremos como nome de arquivo: "foto.html"
<form action="upload.php" method="post" 
enctype="multipart/form-data">

Envie sua foto para o site!
<input type="file" name="foto"><BR>

<input type="submit" value="Enviar Foto!">
</form>

Criamos agora, o arquivo "upload.php", que processa e verifica o upload da foto do usuário:

<?
$erro = $config = array();

// Prepara a variável do arquivo
$arquivo = isset($_FILES["foto"]) ?
$_FILES["foto"] : FALSE;


// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;
// Largura máxima (pixels)
$config["largura"] = 350;
// Altura máxima (pixels)
$config["altura"] = 180;

// Formulário postado... executa as ações
if($arquivo)
{
// Verifica se o mime-type do arquivo é de imagem
if(!eregi("^image/(pjpeg|jpeg|png|gif|bmp)$",
$arquivo["type"]))

{
$erro[] = "Arquivo inválido!
A imagem deve ser jpg, jpeg,

bmp, gif ou png. Envie outro arquivo";
}
else
{
// Verifica tamanho do arquivo
if($arquivo["size"] > $config["tamanho"])
{
$erro[] = "Arquivo em tamanho muito grande!
A imagem deve ser de
no máximo " . $config["tamanho"] . " bytes.

Envie outro arquivo";
}

// Para verificar as dimensões da imagem
$tamanhos = getimagesize($arquivo["tmp_name"]);

// Verifica largura
if($tamanhos[0] > $config["largura"])
{
$erro[] = "Largura da imagem não deve ultrapassar
" . $config["largura"] . " pixels";

}

// Verifica altura
if($tamanhos[1] > $config["altura"])
{
$erro[] = "Altura da imagem não deve ultrapassar
" . $config["altura"] . " pixels";

}
}

// Imprime as mensagens de erro
if(sizeof($erro))
{
foreach($erro as $err)
{
echo " - " . $err . "<BR>";
}

echo "<a href="foto.html">
Fazer Upload de Outra Imagem</a>";

}

// Verificação de dados
// Nenhum erro, executa então o upload...

else
{
// Pega extensão do arquivo
preg_match("/.(gif|bmp|png|jpg|jpeg){1}$/i",
$arquivo["name"], $ext);


// Gera um nome único para a imagem
$imagem_nome =
md5(uniqid(time())) . "." . $ext[1];


// Caminho de onde a imagem ficará
$imagem_dir = "fotos/" . $imagem_nome;

// Faz o upload da imagem
move_uploaded_file($arquivo["tmp_name"]
, $imagem_dir);


echo "Sua foto foi enviada com sucesso!";
}
}
?>

1 - Você deve alterar as variáveis de configuração, especificando o tamanho e as dimensões máximas das imagens que você permitirá upload:

// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;
// Largura máxima (pixels)
$config["largura"] = 350;
// Altura máxima (pixels)
$config["altura"] = 180;

2 - Ao invés de fazer verificação da extensão do arquivo (se é .gif, .png, etc..), verifica-se o mime-type do arquivo, prevenindo assim de usuários mal-intencionados alterarem extensões de não imagens e fazerem o upload (ex: usuário tem um vírus com extensão .exe, altera a extensão para .jpg e faz o upload):

// Verifica se o mime-type do arquivo é de imagem
if(!eregi("^image/(pjpeg|jpeg|png|gif|bmp)$",
$arquivo["type"]))

{
$erro[] = "Arquivo em formato inválido!
A imagem deve ser jpg, jpeg, bmp, gif ou png.
Envie outro arquivo";

}

3 - Verifica o tamanho do arquivo, para evitar que usuários mal-intencionados ou inexperientes, "scaneiem" alguma imagem e a salve em qualidade máxima, sendo assim de tamanho para mais de 1MB!

// Verifica tamanho do arquivo
if($arquivo["size"] > $config["tamanho"])
{
$erro[] = "Arquivo em tamanho muito grande!
A imagem deve ser de
no máximo " . $config["tamanho"] . " bytes.

Envie outro arquivo";
}

4 - Verifica então, as dimensões do arquivo. Para isso, usa-se a função getimagesize, que retorna um array onde o índice 0 é a largura e o índice 1 é a altura da imagem. Note que no argumento usado em getimagesize é usado o índice "tmp_name" do array com os dados do arquivo enviado:

// Para verificar as dimensões da imagem
$tamanhos = getimagesize($arquivo["tmp_name"]);

// Verifica largura
if($tamanhos[0] > $config["largura"])
{
$erro[] = "Largura da imagem não deve ultrapassar "
. $config["largura"] . " pixels";

}

// Verifica altura
if($tamanhos[1] > $config["altura"])
{
$erro[] = "Altura da imagem não deve
ultrapassar " . $config["altura"] . " pixels";
}

Então, essas são as verificações que todo script seu com upload de arquivos, principalmente de imagens, deveria ter. Evitando assim: uso elevado do espaço do servidor, páginas "estourando" de tamanho devido à imagens com dimensões elevadas, arquivos inválidos,
gerando assim imagens quebradas em sua página.

Baixe o código-fonte logo abaixo!

Espero que gostem e usem bem.

Até a próxima
Alfred R. Baudisch

Arquivos anexos ao artigo
Este artigo é a parte 1 de 1 da seguinte série:
  1. Upload de Imagens Com Segurança

cara muito bom seu artigo, to adorado o Plugmaster ele é bem claro com os artigos, você está de parabens
Ola Alfred , gostei do seu tutorial acima, mas como seria se fosse no caso um upload multiplo de imagens? nos ensine, muita gente tem duvida!, vlw abraços!
Cara fiz do jeito que esta ae mas não funciono... oq posso estar errando, ele mostra as mensagens td certo mas não tem nda la no servidor... o nome da pasta é fotos, e eu botei ali no caminho assim: fotos/

essa pasta fotos esta na mesma pasta do fotos.php

Oq pode ser???
Achei muito bom o script e a explicação que o acompanha. Muito obrogado pela ajuda.
Agora como fazer para puxar as fotos e exibilas em uma pagina?
Muito bacana. viu você poderia postar um que jogasse a foto para dentro de uma pasta do site e armazenasse com banco de dados via sql!!! Tipo o usuario entraria no site preencheria um cadastro e fazia um upload da foto. Toda vez que digita o email dele aparecia os dados e a foto!!!
Nossa cara esse script me ajudou de mais muito obrigado
Cara valeu pelas dicas !!!!!!
gostaria de entender para qual pasta a imagem iria no meu computador e onde posso altera isto no codigo. Obrigado
Funcionou perfeitamente, mas para direcionar as fotos eu preciso manter o nome original! Como faço? : Não avaliado
desse jeito não evita que um usuário utilize um caractere NullByte.
por exemplo:

noway.exe%00.jpg


Bom script e em asp como ficaria este script!!!
alexandre <xande_moral>
vou torçer pro meu vasco ser capeão são januario meu caldeirão
O mime-type correto da PNG seria x-png
Melissa Saraiva <melissa@ua.pt>
Olá!
Gostei muito do seu artigo sobre upload de imagens com segurança. Estou a tentar redimensionar a imagem que foi carregada. Sabe alguma forma fácil de fazê-lo sem modificar muito o código?
Já li algumas coisas sobre a biblioteca GD mas não percebi muito bem...
Oxalá me possa ajudar.
Tudo de bom. : Não avaliado
Daniel Dantas <grupodaru@gmail.com>
É com iniciativas assim que a gente iniciante cada vez mais se apaixona....

Valeu Alfred.

Gostaria de saber como entrar em contato com você. valeu
Olha naum estou conseguindo!!!
Renan Orizio <reorizio@homail.com>
Cara muito bom seu tuto, mais estou precisando agora fazer uma página onde todas as imagens upadas fiquem no ar tem como fazer isso? estilo o Orkut? favor entrar em contato no e-mail da minha empresa web.twister@hotmail.com








Um produto Detetive.net