Upload de imagens com segurança
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:
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):
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!
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:
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.
Uma versão melhorada dos códigos desse artigo, pode ser baixado aqui:
http://www.phpbrasil.com/scripts/script.php/id/1415
Espero que gostem e usem bem.
Até a próxima!
Alfred Reinold Baudisch
alfred.baudisch@gmail.com
Blog: http://www.auriumsoft.com.br/blog/
Auriumsoft :: Inteligência, Tecnologia e Vídeo
http://www.auriumsoft.com.br
Auriumsoft Hosting
http://www.auriumhost.com.br
// 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.
Uma versão melhorada dos códigos desse artigo, pode ser baixado aqui:
http://www.phpbrasil.com/scripts/script.php/id/1415
Espero que gostem e usem bem.
Até a próxima!
Alfred Reinold Baudisch
alfred.baudisch@gmail.com
Blog: http://www.auriumsoft.com.br/blog/
Auriumsoft :: Inteligência, Tecnologia e Vídeo
http://www.auriumsoft.com.br
Auriumsoft Hosting
http://www.auriumhost.com.br
Páginas:
1
2
De nada adianta alterar o tamanho máximo do arquivo! Não consigo fazer uploads com tamanho de 3MB!
Mesmo alterando esta parte:
// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;
Para, por exemplo:
$config["tamanho"] = 427532; //4mb
Dá erro!!!!!!!! Mesmo que a imagem tenha as dimensões dentro dos limites! Algúm sabe como resolver? Abaixo o código completo:
<?php
session_start();
require_once("verifica.php");
require_once("connect.php");
//PEGA O ID DO VENDEDOR
$idvendedor = mysql_query ("SELECT idvendedor
FROM vendedor
WHERE vendedor.login = '$_SESSION[login]'
");
$idvendedor = mysql_fetch_row($idvendedor);
$idvendedor = $idvendedor [0];
//pega o número da NF
$nf = $_SESSION[nf];
//prepara variáveis
$erro = array();
// Prepara a variável do arquivo
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;
// Tamanho máximo do arquivo (em bytes)
$config = 427532; //4mb
// Formulário postado... executa as ações
if ($arquivo) {
// Verifica se o mime-type do arquivo é de imagem
if (!eregi("^image\/(pjpeg|jpeg)$", $arquivo["type"])) {
$erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
}
else
{
// Verifica tamanho do arquivo
if ($arquivo["size"] > $config) {
$erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
}
}
// Imprime as mensagens de erro
if (sizeof($erro)) {
foreach ($erro as $err) {
echo "<script>window.location.href='erro_upload.php'</script>";
}
echo "<script>window.location.href='erro_upload.php'</script>";
}
// Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
else
{
// Pega extensão do arquivo
preg_match("/\.(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 = "notasfiscais_secureid/" . $imagem_nome;
// Faz o upload da imagem
move_uploaded_file($arquivo["tmp_name"], $imagem_dir);
//coloca o caminho da foto no banco de dados
$sql = mysql_query ("UPDATE nota
SET foto1 = '$imagem_nome'
WHERE nota.numeronf = $nf AND nota.idvendedor = $idvendedor
");
//volta para a lista de upload
echo "<script>window.location.href='lista_upload.php'</script>";
}
}
?>
Mesmo alterando esta parte:
// Tamanho máximo do arquivo (em bytes)
$config["tamanho"] = 106883;
Para, por exemplo:
$config["tamanho"] = 427532; //4mb
Dá erro!!!!!!!! Mesmo que a imagem tenha as dimensões dentro dos limites! Algúm sabe como resolver? Abaixo o código completo:
<?php
session_start();
require_once("verifica.php");
require_once("connect.php");
//PEGA O ID DO VENDEDOR
$idvendedor = mysql_query ("SELECT idvendedor
FROM vendedor
WHERE vendedor.login = '$_SESSION[login]'
");
$idvendedor = mysql_fetch_row($idvendedor);
$idvendedor = $idvendedor [0];
//pega o número da NF
$nf = $_SESSION[nf];
//prepara variáveis
$erro = array();
// Prepara a variável do arquivo
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;
// Tamanho máximo do arquivo (em bytes)
$config = 427532; //4mb
// Formulário postado... executa as ações
if ($arquivo) {
// Verifica se o mime-type do arquivo é de imagem
if (!eregi("^image\/(pjpeg|jpeg)$", $arquivo["type"])) {
$erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
}
else
{
// Verifica tamanho do arquivo
if ($arquivo["size"] > $config) {
$erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
}
}
// Imprime as mensagens de erro
if (sizeof($erro)) {
foreach ($erro as $err) {
echo "<script>window.location.href='erro_upload.php'</script>";
}
echo "<script>window.location.href='erro_upload.php'</script>";
}
// Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
else
{
// Pega extensão do arquivo
preg_match("/\.(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 = "notasfiscais_secureid/" . $imagem_nome;
// Faz o upload da imagem
move_uploaded_file($arquivo["tmp_name"], $imagem_dir);
//coloca o caminho da foto no banco de dados
$sql = mysql_query ("UPDATE nota
SET foto1 = '$imagem_nome'
WHERE nota.numeronf = $nf AND nota.idvendedor = $idvendedor
");
//volta para a lista de upload
echo "<script>window.location.href='lista_upload.php'</script>";
}
}
?>
30/04/2010 12:16pm
(~14 anos atrás)
100%!!!!!! Funciona!!!!!
Na pasta de destino, que receberá o upload, atribua as permições de gravação de pasta para o público (cmod 777).
VALEU!
Na pasta de destino, que receberá o upload, atribua as permições de gravação de pasta para o público (cmod 777).
VALEU!
31/12/2009 4:02am
(~15 anos atrás)
Segue tabela completa com os mime types:
http://www.grupostbrasil.com.br/mime.sql
Segue lista completa dos mime types:
* ==>> application/octet-stream
asf ==>> video/x-ms-asf
asp ==>> text/asp
asr ==>> video/x-ms-asf
asx ==>> application/x-mplayer2
asx ==>> video/x-ms-asf
asx ==>> video/x-ms-asf
au ==>> audio/basic
avi ==>> video/x-msvideo
bas ==>> text/plain
bin ==>> application/octet-stream
bmp ==>> image/bmp
c ==>> text/plain
class ==>> application/java
class ==>> application/java-byte-code
class ==>> application/octet-stream
class ==>> application/x-java-class
css ==>> text/css
dms ==>> application/octet-stream
doc ==>> application/msword
dot ==>> application/msword
exe ==>> application/octet-stream
flr ==>> x-world/x-vrml
gif ==>> image/gif
gz ==>> application/x-gzip
h ==>> text/plain
hlp ==>> application/winhlp
hta ==>> application/hta
htc ==>> text/x-component
htm ==>> text/html
html ==>> text/html
ico ==>> image/x-icon
jpe ==>> image/jpeg
jpeg ==>> image/jpeg
jpg ==>> image/jpeg
js ==>> application/x-javascript
lha ==>> application/octet-stream
lsf ==>> video/x-la-asf
lsx ==>> video/x-la-asf
lzh ==>> application/octet-stream
m3u ==>> audio/x-mpegurl
mdb ==>> application/x-msaccess
mid ==>> audio/mid
mov ==>> video/quicktime
movie ==>> video/x-sgi-movie
mp2 ==>> video/mpeg
mp3 ==>> audio/mpeg
mpa ==>> video/mpeg
mpe ==>> video/mpeg
mpeg ==>> video/mpeg
mpg ==>> video/mpeg
mpv2 ==>> video/mpeg
pdf ==>> application/pdf
pot ==>> application/vnd.ms-powerpoint
pps ==>> application/vnd.ms-powerpoint
ppt ==>> application/vnd.ms-powerpoint
qt ==>> video/quicktime
ra ==>> audio/x-pn-realaudio
ram ==>> audio/x-pn-realaudio
rmi ==>> audio/mid
rtf ==>> application/rtf
rtx ==>> text/richtext
snd ==>> audio/basic
stm ==>> text/html
tar ==>> application/x-tar
txt ==>> text/plain
vrml ==>> x-world/x-vrml
wav ==>> audio/x-wav
wrl ==>> x-world/x-vrml
wrz ==>> x-world/x-vrml
xaf ==>> x-world/x-vrml
xla ==>> application/vnd.ms-excel
xlc ==>> application/vnd.ms-excel
xlm ==>> application/vnd.ms-excel
xls ==>> application/vnd.ms-excel
xlt ==>> application/vnd.ms-excel
xlw ==>> application/vnd.ms-excel
xml ==>> application/xml
xml ==>> text/xml
xof ==>> x-world/x-vrml
zip ==>> application/x-compressed
zip ==>> application/x-zip-compressed
zip ==>> application/zip
zip ==>> multipart/x-zip
http://www.grupostbrasil.com.br/mime.sql
Segue lista completa dos mime types:
* ==>> application/octet-stream
asf ==>> video/x-ms-asf
asp ==>> text/asp
asr ==>> video/x-ms-asf
asx ==>> application/x-mplayer2
asx ==>> video/x-ms-asf
asx ==>> video/x-ms-asf
au ==>> audio/basic
avi ==>> video/x-msvideo
bas ==>> text/plain
bin ==>> application/octet-stream
bmp ==>> image/bmp
c ==>> text/plain
class ==>> application/java
class ==>> application/java-byte-code
class ==>> application/octet-stream
class ==>> application/x-java-class
css ==>> text/css
dms ==>> application/octet-stream
doc ==>> application/msword
dot ==>> application/msword
exe ==>> application/octet-stream
flr ==>> x-world/x-vrml
gif ==>> image/gif
gz ==>> application/x-gzip
h ==>> text/plain
hlp ==>> application/winhlp
hta ==>> application/hta
htc ==>> text/x-component
htm ==>> text/html
html ==>> text/html
ico ==>> image/x-icon
jpe ==>> image/jpeg
jpeg ==>> image/jpeg
jpg ==>> image/jpeg
js ==>> application/x-javascript
lha ==>> application/octet-stream
lsf ==>> video/x-la-asf
lsx ==>> video/x-la-asf
lzh ==>> application/octet-stream
m3u ==>> audio/x-mpegurl
mdb ==>> application/x-msaccess
mid ==>> audio/mid
mov ==>> video/quicktime
movie ==>> video/x-sgi-movie
mp2 ==>> video/mpeg
mp3 ==>> audio/mpeg
mpa ==>> video/mpeg
mpe ==>> video/mpeg
mpeg ==>> video/mpeg
mpg ==>> video/mpeg
mpv2 ==>> video/mpeg
pdf ==>> application/pdf
pot ==>> application/vnd.ms-powerpoint
pps ==>> application/vnd.ms-powerpoint
ppt ==>> application/vnd.ms-powerpoint
qt ==>> video/quicktime
ra ==>> audio/x-pn-realaudio
ram ==>> audio/x-pn-realaudio
rmi ==>> audio/mid
rtf ==>> application/rtf
rtx ==>> text/richtext
snd ==>> audio/basic
stm ==>> text/html
tar ==>> application/x-tar
txt ==>> text/plain
vrml ==>> x-world/x-vrml
wav ==>> audio/x-wav
wrl ==>> x-world/x-vrml
wrz ==>> x-world/x-vrml
xaf ==>> x-world/x-vrml
xla ==>> application/vnd.ms-excel
xlc ==>> application/vnd.ms-excel
xlm ==>> application/vnd.ms-excel
xls ==>> application/vnd.ms-excel
xlt ==>> application/vnd.ms-excel
xlw ==>> application/vnd.ms-excel
xml ==>> application/xml
xml ==>> text/xml
xof ==>> x-world/x-vrml
zip ==>> application/x-compressed
zip ==>> application/x-zip-compressed
zip ==>> application/zip
zip ==>> multipart/x-zip
15/06/2007 9:19am
(~17 anos atrás)
Dá o erro e tem a pasat fotos no diretório:
Warning: move_uploaded_file(fotos/e0e487e9a9.jpg) [function.move-uploaded-file]: failed to open stream: Permission denied in /home/xyz/public_html/templat/adm/imgs.php on line 86
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpo7Pp8W' to 'fotos/e0e487e9a9.jpg' in /home/xyz/public_html/templat/adm/imgs.php on line 86
Warning: move_uploaded_file(fotos/e0e487e9a9.jpg) [function.move-uploaded-file]: failed to open stream: Permission denied in /home/xyz/public_html/templat/adm/imgs.php on line 86
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpo7Pp8W' to 'fotos/e0e487e9a9.jpg' in /home/xyz/public_html/templat/adm/imgs.php on line 86
04/12/2006 4:44pm
(~18 anos atrás)
Muito bom o tutorial Alfred! Estava procurando um script para upload de imagens a um bom tempo...
Mas tem um probleminha, eu queria que as imagens fossem gravadas com o nome original dela ou com: "palavrafixa_onomeorigial". Como faço isso?
Mas tem um probleminha, eu queria que as imagens fossem gravadas com o nome original dela ou com: "palavrafixa_onomeorigial". Como faço isso?
13/11/2006 9:22am
(~18 anos atrás)
Bom dia, cara quando eu executo esse codigo, vai normal, mas quando eu adiciono ele na minha pagina para fazer upload, da o seguinte erro no php "Notice: Undefined offset: 1 in ... ", como eu arrumo isso?
abraços.
abraços.
11/10/2006 7:21am
(~18 anos atrás)
da maneira que eu fiz, com o cadastro em duas etapas, funcionou legal, o que eu quero é que trabalhe tudo no mesmo formulario
19/09/2006 6:38am
(~18 anos atrás)
Instalei sem qualquer problema o script e funcionou. Porém não consegui fazer exatamente o que eu queria, que é uma página de cadastro no banco de dados incluindo a foto. Depois de muito penar, eu fiz o seguinte, na primeira página entra-se com os dados e escolhe-se num "radio" se vai ter imagem ou não, caso não haja a coluna "logo" do banco de dados recebe um "n" e o apos processado o formaulário a página volta para a página principal. Caso seja escolhida a opção que há imagem, a coluna logo recebe um id unica gerada com o md5 deste script, e essa variavel é passada para a pagina do formulario de upload de imagens, que por sua vez é passado para a página do script. Eu usei o dreamweaver para gerar a tabela decadastro no mysql, e a action do form é para a própria página. tentei inserir o script por aí e tentei também após adcionar tudo no banco de dados, ir para a página do script, mas nada funcionou... Alguém poderia dizer como fazer esse script funcionar dentro de um formulário que também envia dados para um banco de dados? obrigado
19/09/2006 6:36am
(~18 anos atrás)
Alguem sabe como solucionar?