Na minha trajetória e meu tempo de desenvolvimento em Laravel tive a oportunidade de ver inúmeros métodos de desenvolvimento estranhos e incoerentes.
Mas afinal o que de mal poderia acontecer caso eu decidisse copiar a pasta Storage pra dentro da pasta public?
Sabendo que toda a arquitetura de pastas do laravel é muito bem desenvolvida, você teria problemas em todos os uploads não estarem na pasta Storage, porém o problema fica maior quando você se aprofunda mais e mais no ambiente do Laravel e em pacotes disponíveis para o mesmo.
Quais os riscos afinal?
Até pouco tempo atrás o PHP tinha uma falha crítica em erros quando o display erros estava on, dependendo do erro de DB que ocorria ele expunha o nome do usuário, senha, e dados de acesso em geral do banco de dados, causando uma enorme falha de segurança, imagine que por um momento essa falha aconteça, talvez por excesso de conexão, e no log fique exposto esses dados, e você deixou público o acesso ao log, seria uma catástrofe sem precedentes.
O mesmo vale ao expor a pasta inteira do storage usando o comando:
ln -s /path/storage /path/public/
Com o par de chaves o risco também é muito grande uma vez que o par de chaves é responsável principalmente por questões de autenticação no caso do pacote jwt-auth ele é responsável por participar da geração do token Bearer que será transmitido ao usuário, imagina o risco de alguém ter acesso a esse par de chaves.
Como deveria ser feito?
O primeiro passo é utilizar o comando do laravel para gerar o link simbólico na pasta public.
php artisan storage:link
Feito isso você pode fazer upload de arquivos utilizando comandos como:
$request->file(‘nome’)->store(‘public’);
$request->file(‘file2’)->store(‘public/thumbs’);
Dentro dos controladores que receberam arquivos, claro que tem inúmeros comandos de segurança e validações mas aqui estou dando ênfase somente nos argumentos que expor a pasta storage por completo é inteiramente inseguro.
Utilizar as maneiras padronizadas garantem que problemas de segurança sejam minimizadas.
Conclusão
Em resumo, a segurança é um alicerce essencial em qualquer projeto de desenvolvimento. Ao seguir as práticas recomendadas e evitar expor a pasta 'Storage' publicamente, você está protegendo não apenas seus dados, mas também a integridade do seu aplicativo Laravel.
Lembre-se sempre de utilizar o comando 'php artisan storage:link' e as funções de upload seguras dentro dos controladores. Ao fazê-lo, você estará trilhando o caminho da segurança e evitando riscos desnecessários.
Mantenha-se informado e atualizado sobre as melhores práticas de segurança do Laravel, pois, em última análise, a segurança é a chave para o sucesso contínuo do seu projeto. Proteja, previna e desenvolva com responsabilidade.
Espero que meu artigo te ajude de alguma forma, e que elucide pontos de seguranças dentro dos meus argumentos.
pHqghUme
22/04/2026 10:43555-1 waitfor delay '0:0:15' --
pHqghUme
22/04/2026 10:43555xgDEfS4t'; waitfor delay '0:0:15' --
pHqghUme
22/04/2026 10:43555-1 OR 560=(SELECT 560 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:43555-1) OR 508=(SELECT 508 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:43555-1)) OR 269=(SELECT 269 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:44555Jyyvz4Os' OR 590=(SELECT 590 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:4455532S9skVt') OR 733=(SELECT 733 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:44555XlNPhlPd')) OR 917=(SELECT 917 FROM PG_SLEEP(15))--
pHqghUme
22/04/2026 10:44555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
pHqghUme
22/04/2026 10:44555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
pHqghUme
22/04/2026 10:44(select DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15) from dual)
pHqghUme
22/04/2026 10:44555
pHqghUme
22/04/2026 10:44555'"
pHqghUme
22/04/2026 10:44@@p38dl
pHqghUme
22/04/2026 10:44(select 198766*667891)
pHqghUme
22/04/2026 10:44(select 198766*667891 from DUAL)
pHqghUme
22/04/2026 10:47555
pHqghUme
22/04/2026 12:12555
pHqghUme
22/04/2026 12:12555
pHqghUme
22/04/2026 12:12555