-
-
Save TiuTalk/534927c91bc82811170b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Define o tempo máximo de execução em 0 para as conexões lentas | |
set_time_limit(0); | |
// Arqui você faz as validações e/ou pega os dados do banco de dados | |
$aquivoNome = 'imagem.jpg'; // nome do arquivo que será enviado p/ download | |
$arquivoLocal = '/pasta/do/arquivo/'.$aquivoNome; // caminho absoluto do arquivo | |
// Verifica se o arquivo não existe | |
if (!file_exists($arquivoLocal)) { | |
// Exiba uma mensagem de erro caso ele não exista | |
exit; | |
} | |
// Aqui você pode aumentar o contador de downloads | |
// Definimos o novo nome do arquivo | |
$novoNome = 'imagem_nova.jpg'; | |
// Configuramos os headers que serão enviados para o browser | |
header('Content-Description: File Transfer'); | |
header('Content-Disposition: attachment; filename="'.$novoNome.'"'); | |
header('Content-Type: application/octet-stream'); | |
header('Content-Transfer-Encoding: binary'); | |
header('Content-Length: ' . filesize($aquivoNome)); | |
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); | |
header('Pragma: public'); | |
header('Expires: 0'); | |
// Envia o arquivo para o cliente | |
readfile($aquivoNome); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tem uma crítica vulnerabilidade nisto, uma vez que não há qualquer filtro no
$aquivoNome
. Por essa razão todas as pastas que podem ser acessadas. Não recomendo utiliza-la sem utilizar ao menos umif(!preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $aquivoNome)){
. O ataque pode ser feito da seguinte maneira, imagine o cenário:Supostamente você vai fazer a leitura de:
Correto? Se for feito algo do tipo:
Você espera que o parâmetro
arquivos
sejadocumento.pdf
. Porém, uma pessoa poderá fazer umGET
utilizando o parâmetroarquivos=../public_html/snippet.php
, logo irá baixar o arquivo:Pronto, ele baixou o
snippet.php
, o arquivo PHP.Isso pode ser mais grave, porque pode baixar o arquivos de senhas, como o
etc/passwd
....Existem duas soluções, podem ser utilizadas em conjunto o
realpath
para eliminar os caminhos dinâmicos, porém não impede/alcancar/outras/pastas
, para somente filtrar o nome do arquivo e o seu formato (exemplo.formato
) poderá utilizar o regex mencionado acima, inclusive fiz isto neste fork.