Include Seguro

Started by rodweb, 03 de January , 2008, 11:58:02 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

rodweb

Bem, com esse código você consegue fazer seu include bem seguro...não permitindo que tentem incluir arquivos de diretórios anteriores ou que não sejam .php

Segue o código abaixo:

<?php
# Include seguro by rodweb
# msn&#46;rod@hotmail&#46;com
# 03-01-2008
if(isset($_GET['p'&#93;)){
$page $_GET['p'&#93;&#46;'&#46;php';
}

if(isset(
$page) and file_exists($page) and ereg("([\&#46;&#93;+/)+"$page)==FALSE){
echo 
'inclue';
include($page);
} else {
include('index&#46;php');
}
?>



Partes de edição opcional:

Quoteif(isset($_GET['p'])){
   $page = $_GET['p'].'.php';
}

'p' - Essa é variável passada por Get com o nome do arquivo


Quote} else {
   include('index.php');
}

'index.php' - Essa é a página padrão em caso de erro.


Façam um bom proveito e comentem aí!

Flws...

Magrinho Loko

Pode usar também switch. É mais "profissional". :)

Porém essa forma ai seja rápida e funcional.
Saudades do antigo Darkers.

rodweb

Quote from: "Magrinho Loko"Pode usar também switch. É mais "profissional". :)

Porém essa forma ai seja rápida e funcional.

Sim, usava desta maneira antes também.

branco

e se quisermos incluir arquivos em outros diretorios ?

talvez seja melhor privar usuários mal intencionadios apenas de descer diretórios.

só sugestão ^^

até
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

rodweb

Quote from: "branco"e se quisermos incluir arquivos em outros diretorios ?

talvez seja melhor privar usuários mal intencionadios apenas de descer diretórios.

só sugestão ^^

até

Hehe branco, é exatamente isso que ele faz ;)

d3rf

Voce poderia combinar com o .htaccess as url amigaveis, ae sim ficaria top !
Vou ver se consigo e post aki

rodweb

Sim, eu estou fazendo desse jeito agora :D

www.site.com/secaotal
dai inclui

Eu estava pensando em postar algo sobre isso também, usando uns exemplos com php.

branco

hmm ótimo então ^^ nao verifiquei o código direito, sorry =]

até
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

caesar2k

O melhor jeito de fazer um include seguro é sempre usar paths absolutos para os arquivos PHP. Assim, se o cara tenta loadar uma página tipo:
www.pagina.com/index.php?pagina=www.google.com
o include seria:
$base = "http://www.pagina.com/"; // ou no caso, poderia ser um /root/pagina/public_html/
include ($base . $_GET['pagina']);
Dessa forma, fica impossível alguém incluir qualquer arquivo de script e ownar teu site.

branco

ou desativar include de sites né ^^ no php.ini

dessas duas maneiras, ainda ficará vulneravel a diretorio transversal.

ai se aplica o ereg_replace pra retirar os pontos..

até
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

rodweb

Quote from: "branco"dessas duas maneiras, ainda ficará vulneravel a diretorio transversal.

ai se aplica o ereg_replace pra retirar os pontos..

Repare aqui:
Quoteif(isset($page) and file_exists($page) and ereg("([\.]+/)+", $page)==FALSE){

Já verifica se tem ./, ../, ../../../ etc...

Mesmo assim está vulnerável?

Flws...

branco

não rodweb, só estou dizendo que das duas maneiras, ( do caesar e a ultima que eu disse ) ainda estão vulneraveis a diretorio transversal.

com a retirada dos pontos não está mais.

até

ops, reparando seu codigo aqui, reparei que esta vul sim..

olha :

if(isset($page) and file_exists($page) and ereg("([\.]+/)+", $page)==FALSE)

significa se a URL não tiver pontos, e o file existir, vai incluir

como vc está incluindo diretamente $page

se agente fizer $page = "/etc/passwd"
irá funcionar sem precisarmos descer diretórios, pois / já significa o diretorio raiz.

agora é só concertar isso e já era ^^
preciso ir, até
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

rodweb

Não não, ele bloqueia a "/" e também, os "./", "../" ;)

Desta vez eu acertei xD

Flws...

branco

da pra vc explicar direito oque essa expressao regular faz ?

testei aqui, da pra incluir diretorios acima, então é impossivel não podermos passar para a variavel $p o valor c:\algumacoisa.txt

aguardo respostas, até
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

rodweb

Quote from: "branco"da pra vc explicar direito oque essa expressao regular faz ?

testei aqui, da pra incluir diretorios acima, então é impossivel não podermos passar para a variavel $p o valor c:\algumacoisa.txt

aguardo respostas, até

Não, você passa para a variável $p, o nome do arquivo que você quer que inclua.

Ex:

http://127.0.0.1/index.php?p=teste (inclui o teste.php)

------------------

E desculpa aí, agora entendi o que você falou antes...

No windows daria pra incluir arquivos, por que usa barra invertida:

index.php?p=../teste.php (não inclui)
index.php?p=..\teste.php (inclui)

Mesmo assim só incluiria arquivos php...

Mais já arrumei, vou só postar a alteração da expressão regular no ereg:

if(isset($page) and file_exists($page) and ereg("^\.*[\/]+", $page)==FALSE){
Agora nem ../ nem ..\ ;)

Flws...