Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Zinhani

[Resolvido] Acesso direto ao arquivo

Recommended Posts

Olá pessoal,

 

Tenho uma dúvida que já foi muito discutida aqui no fórum entretanto nenhum dos posts que já andei olhando tratam esse problema, creio eu, de forma correta.

 

Uso na construção do meu site juntamente com seu sistema administrativo apenas uma pagina index principal para o site e uma para o admin.

 

Partindo do principio que para mostrar as outras paginas essas serão incluídas na index principal, por include/require ou através do get ex: index.php?page=inicial, ?page=news... etc.

 

O Problema:

 

Supondo que todos os usuários visitem o site como a url é mostrada no navegador ninguém vai ter problema e tudo ficara bem. Mas, caso um engraçadinho comece a colocar a extensão do arquivo na url algumas coisas estranhas poderão acontecer. ex: www.site.com.br/news.php, www.site.com.br/Admin/usuarios.php

 

Isso

56b

geralmente ocorre quando usamos arquivos incluídos de outras pastas no arquivo index principal. E muitas vezes se acessado diretamente vai ser mostrado o conteúdo do html do arquivo ou geralmente um warning de erros por include ou require. Esse ultimo, porque geralmente o arquivo incluido esta ou na pasta raiz ou em outras pasta que não seja aquela onde reside o arquivo acessado.

 

...

 

Ok, nem sempre isso gera problemas de segurança, mas tratando-se de um sistema mais profissional, eu já vi muitas vezes sites e sistemas webs fazerem como que esse tipo de acesso direto ao arquivo ser direcionado para a pagina de erro 404.

 

Ai fica a dúvida mal resolvida: como resolver isso de forma correta?

 

Sei que existem "n" opções... Mas muitas delas, inclusive as tratadas aqui no fórum são as melhores soluções para sistemas e sites de grande porte com centenas e centenas de arquivos.

 

Vejamos,

 

- sendo que cada arquivo do Admin contém uma validação e geralmente essa validação esta em um arquivo separado e que é incluido/requerido no inicio do mesmo. Para não dar warnig ou o html não ser mostrado o arquivo de validação teria que ser colocado jundo ao arquivo q é acessado e ainda com alguma validação, pq se o arquivo estiver em pasta quando ele é incluído na index principal ele é considerado como se estivesse na pasta raiz. Isso pra mim num sistema complexo seria total

537

mente complicado de administrar. Seria arquivos e arquivos de validação em varias pastas e se precisar alterar um vai ter que ficar procurando todos os outros. Sem falar que seria necessário uma validação para qual include/require o arquivo iria receber, pois como dito, uma para quando ele é acessado na index principal e outra para quando for direto. Além de que no acesso direto não tem como validar sessão, uma vez q ela é iniciada na index e não no arquivo. E caso fosse necessário teria que se iniciar a sessão em todos os arquivos e eu não sei as conseqüências disso uma vez q ela seria iniciada no arquivo index principal tbm, isso não parece ser correto.

 

Talvez, como eu sou um mero programador, eu tenha perdido essa aula e a resposta para esse problema seja bem mais fácil do que eu imagino. Ou melhor, que esse método utilizado na criação de sites e sistema não seja o melhor a ser usado.

 

Peço ajuda tanto para resolver esse problema como para se for o caso novas técnicas de desenvolvimento.

 

Como também não entendo muito de configuração de servidor será que existe alguma configuração direta no host do tipo, deu erro de warning ele já manda pra pagina 404?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Warning é erro de PHP e será mostrado apenas em âmbito HTML, o servidor não faz idéia de que o mesmo ocorreu.

 

Se deseja que o usuário receba uma 404 ao tentar fazer gracinha, suponho que já tenha entendido como funciona, não?

 

A chave está em fazer a checagem file_exists antes do include, se falhar, enviar para o 404.

 

Também é possível ser menos genérico e mais incisivo, afinal, supõe-se que, utilizando o sistema a partir do sistema, nenhum link nos leve a uma 404, certo?

 

Logo, se foi requisitado uma página que não existe, foi mau uso do cliente e não má programação. O que pode ser feito é enviar uma mensagem de erro imperativa, do tipo "Utilize apenas os links fornecidos pelo sistema!"

 

Uma proteção adicional que pode ser criada, é criar uma tabela de BD, dando um ID para cada página, e relacionar o endereço com o ID. Se quiser deixar mais "legal" ainda, pode relacionar o endereço com um hash(md5, ou sha1) e passar via GET, o hash

 

primeira forma

$pg = $_GET['pagina'];
if(!file_exists($pg)) header('Location: ./?erro=404');

 

segunda forma

$pg = $_GET['pagina'];
if(!file_exists($pg)) die('<h1>Por favor, utilize apenas os links fornecidos pelo sistema!</h1>');

 

terceira forma [variação A, ID]

// endereço = www.meusite.com.br/?pg=2
$pg = $_GET['pg'];
mysql_connect('localhost','root','');
$sql = mysql_query('select endereco from paginas where id = '.$pg) or die(mysql_error());
if(!mysql_num_rows($sql)) header('Location: ./?erro=404');

 

terceira forma [variação B, hash]

// endereço = www.meusite.com.br/?pg=4b96d5c1ff3123ba069ddc760794963a
$pg = $_GET['pg'];
mysql_connect('localhost','root','');
$sql = mysql_query('select endereco from paginas where hash = '.$pg) or die(mysql_error());
if(!mysql_num_rows($sql)) header('Location: ./?erro=404');

Compartilhar este post


Link para o post
Compartilhar em outros sites

ai cara ve isso ajuda

 

Vamos usar urls amigaveis mas aconselho a mudar teu sistema

 

cria um arquivo (.htaccess) na raiz do teu site

 

URL Original:

http://www.teusite.com/index.php?page=news

URL Reiscrita:

http://www.teusite.com/page/news.php
ops: troque a url original para a reescrita para funcionar no teu
<a href='http://www.teusite.com/page/$_GET['page'].php'></a>

 

cria um arquivo (.htaccess) na raiz do teu site

 

e coloca isso dentro

#ligamos o motor de resscrita
RewriteEngine On

#Reescrevemos a url
RewriteRule ^page/([^/]*)\.php$ /index.php?page=$1 [L]

#aqui crie uma pagina personalizado com o erro 404 pagina nao encontrada etc..
ErrorDocument 400 /erros/pagina-nao-encontrada.html 

a e pelo amor de deus não use include nem require para arquivos via url GET

exemplo

http://www.teusite.com/index.php?page=news
http://www.teusite.com/index.php?page=CMD-HACKER-EXPLOITE.txt?
http://www.teusite.com/index.php?page=CMD-HACKER-EXPLOITE.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito Obrigado vcs dois...

 

Mas Evandro...

 

Se eu acessar o arquivo diretamente não estou levando variáveis na url

Nas 4 opções citadas eu uso na index principal que é responsável pela exibição de todos os outros arquivos.

inclusive eu faço uso das mesmas em diversas situações.

 

Mas o problema continua quando acessamos um arquivo diretamente.

fica naquele problema que eu disse no 1º post.

 

...

 

Ozório

 

Acho q a resposta é por ai mesmo...

usar url amigavel alem de tornal o site muito mais profissional o uso do .htaccess como você disse ja informa a pag 404, que é o que eu estava procurando.

Vou ler mais sobre o assunto e adaptar o sistema.

 

Quanto a isso:

 

ficou uma dúvida, eu valido o get usando uma array como o nome de todas os arquivos e ainda valido com file_exists .

Será q mesmo assim é possível receber um ataque "php injection" por mais amador que isso pareça?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho q a resposta é por ai mesmo...

usar url amigavel alem de tornal o site muito mais profissional o uso do .htaccess como você disse ja informa a pag 404, que é o que eu estava procurando.

Vou ler mais sobre o assunto e adaptar o sistema.

 

entao a guestao principal do topico foi resolvida ? claro a discussao sobre a parte de segurança pode continuar =] mas posso colocar [Resolvido] ?

 

valww

Compartilhar este post


Link para o post
Compartilhar em outros sites

ficou uma dúvida, eu valido o get usando uma array como o nome de todas os arquivos e ainda valido com file_exists .

Será q mesmo assim é possível receber um ataque "php injection" por mais amador que isso pareça?

se passar um caminho real pelas _GET, corre sim.

 

Opte pela terceira alternativa que lhe propus. Você faz referência a um ID (pode ser até mesmo um nome amigável identificador) e seu código verifica se aquele ID é válido e inclui a página correspondente

 

quanto ao 404+mod_rewrite, você não concorda comigo que, uma vez que SEMPRE redirecionamos as páginas até index.php, NUNCA teremos um erro de nível 404 ?

Não digo que está errado, a formulação está perfeita e deve sim ser implementada, mas funcionaria para o caso de o usuário digitar www.meusite.com.br/news.php por exemplo, caso a news.php não exista, seja exibida uma página personalizada, não para o caso de o redirect enviar uma variável inválida

 

a pergunta quanto ao usuário tentar exibir a página que será incluída: Bom, a saída é um HTML processado, ele 'verá' tudo que ele veria acessando normalmente. Se for por exemplo a página que segura as informações de conexão do banco:

$host = 'localhost';
$usuario = 'root';
$senha = '';
mysql_connect($host,$usuario,$senha);

 

se alguém acertar que seu arquivo de conexão do banco é config.php por exemplo, e digitar no navegador, verá uma página em branco ou, no máximo, um Notice informando que não foi possível conectar ao banco

 

ainda assim, é possível setar no .htaccess as permissões para os documentos dentro de um diretório, mas eu não manjo NADA disso, vou ficar devendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Zinhani, você poderia checar a URL atual. Se for news.php e não index.php então exibe um error 404 (obivamente, fazendo isso dinamicamente). Claro que reescrita de url é bem mais profissional... e bonitinho.

 

Uma maneira para os inclues sempre funcionarem, é utilizar url absolutas. Por exemplo:

define('DS', DIRECTORY_SEPARATOR);
define('PATH', url_absoluta_aqui);
Aí basta, nos includes:

include PATH . DS . 'arquivo.php';
Para pegar a url completa, você pode combinar dirname(), e __FILE__.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$url_absoluta = '( url do seu site)';
$url_phpself = $_SERVER['PHP_SELF'];
if (!ereg($url_absoluta, $url_phpself)) { header("Location: pagina_de_nao_encontrado.php"); }

depois de pesquisar bastante e conversar com alguns amigos

o que acham desse código?

poderiam dar alguma opinião

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.