É “não carregar esta página diretamente” realmente necessário em PHP?

StackOverflow https://stackoverflow.com/questions/108301

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu ia perguntar qual a melhor maneira de fazer isso é, mas depois decidiu que eu deveria perguntar se é ou não é mesmo necessário. Eu nunca vi isso feito no desenvolvimento JSP, mas parece ser uma prática comum em PHP. Qual é o raciocínio por trás disso, e se eu não protegem contra isso, o que mais eu deveria estar levando em consideração?

Foi útil?

Solução

A razão que esta é mais comum em PHP do que outras linguagens semelhantes tem a ver com a história do PHP. As primeiras versões do PHP tinha o "register_globals" configuração como um padrão (na verdade, ele pode não ter sido sequer uma configuração em versões muito cedo). Register_globals diz PHP para definir variáveis ??globais de acordo com a string de consulta. Então, se você consultado um script assim:

http://site.com/script.php?hello=world&foo=bar

... o script define automaticamente um Olá $ variável com "mundo" valor e $ foo com o valor de "bar".

Para script de tal, se você soubesse os nomes de variáveis-chave, foi possível explorar o script especificando essas variáveis ??na cadeia de consulta. A solução? Definir alguma corda mágica no script do núcleo e, em seguida, fazer todos os scripts auxiliares verificar a seqüência de magia e socorrer, se ele não está lá.

Felizmente, quase ninguém usa register_variables mais, mas muitos scripts são ainda muito mal escrito e fazer suposições estúpidas que levá-los a fazer os danos se eles são chamados fora de contexto.

Pessoalmente, eu evitar a coisa toda usando o framework Symfony, que (pelo menos na sua configuração padrão) mantém os controladores e modelos para fora da raiz da web completamente. O único ponto de entrada é o controlador de frente.

Outras dicas

Se você incluir tudo do lado de fora da raiz web, então não é um problema, pois nada pode ser carregado diretamente.

Bem, Isso é para evitar sensível inclui de serem enviados para o servidor web diretamente. Certamente não é uma medida de segurança all-inclusive, mas poderia ajudar com sua configuração particular.

Se, no entanto, o usuário estava em uma posição para incluir o arquivo de seu próprio script, ele não vai ajudar em tudo

Eu emitem uma página 404, não como uma medida de segurança grave, mas só porque eu não gosto de vazamento de informações sobre o funcionamento interno de um site, mesmo os nomes dos arquivos internos.

Mas se o arquivo contém apenas funções então não há nenhum dano real ao omitir a verificação.

Ele também não é apenas um recurso de segurança em php, mas mais de quantos função de sites PHP com base MVC. Se, por exemplo, em SugarCRM você fosse para chamar um arquivo de módulo diretamente o carregamento da página iria falhar porque o controlador, exibição e modelo não foram previamente carregado e você não teria nenhuma informação db config / conexão ou, então, para se certificar de todas as dependências são carregados os usuários é forçado através de um ponto de entrada conhecido - ou seja index.php

Eu só descobri uma abordagem no sistema .Net MVC que você poderia replicar para PHP usando Apache Rewrites, arquivos .htaccess ou se você estiver usando o IIS, um arquivo web.config.

Como o padrão doens't MVC precisa que o usuário aspx diretamente acessar arquivos estes não são servidos e um 404 é enviado em seu lugar. Se você tem uma convenção de nomenclatura para arquivos incluídos "inc.php", por exemplo, você poderia redirecionar * .inc.php solicitações para um 404 para pastas específicas - em Apache Rewrite abastecimento de R = 404 no final da regra retornará que HTTP status de para o seu cliente.

Alguns destes exemplos podem ajudar: Apache Rewrite Exemplos

Como já foi mencionado em algumas das outras respostas, você não precisa fazer isso. Se um arquivo não é suposto ser servido pelo servidor web, você não deve deixá-lo dentro da pasta web. Inclui deve ser colocado em um diretório fora da raiz web.

Além disso, a maneira correta de dizer ao usuário que uma página não existe, é emitindo um status 404, usando:

header("HTTP/1.0 404 Not Found");
exit;

Se você não fizer isso, é difícil para os não-humanos (Ex. Procurar-motores) para distinguir entre uma página regular e um não-página.

Isto é muito importante porque se você está editando seu site executando o Google Toolbar, ele vai encontrar seus arquivos php interior e, em seguida, colocá-los em resultados de pesquisa. Na melhor das hipóteses isso vai criar uma experiência desagradável para os usuários, mas se você é um programador descuidado, poderia revelar informações de conexão banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top