Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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,
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?
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.phpops: troque a url original para a reescrita para funcionar no teu <a href='[http://www.teusite.com/page/$_GET['page'].php'>](http://www.teusite.com/page/%24_GET%5B)
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
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:
>
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
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?
>
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
>
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.
Por mim esta resolvido
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__.
$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
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
segunda forma
terceira forma [variação A, ID]
// endereço = www.meusite.com.br/?pg=2
terceira forma [variação B, hash]
// endereço = www.meusite.com.br/?pg=4b96d5c1ff3123ba069ddc760794963a