include no minimo estranho

rpnetwork

Power Member
Boas, estou com um problema que parece que se resolve muito bem, mas não estou a conseguir resolver.
PHP:
$page = "'pages/" . $pag . ".php'";
    //echo $page;
    include($page);
basicamente o $pag vai buscar o valor a um $_get[], até ai tudo bem, o problema começa quando eu quero fazer o include e ele dá.me erro:
Warning: include('pages/home.php') [function.include]: failed to open stream: No such file or directory in C:\serverphp\www\r.a.i.n-project\index.php on line 81

Warning: include() [function.include]: Failed opening ''pages/home.php'' for inclusion (include_path='.;C:/serverphp\php5\pear\') in C:\serverphp\www\r.a.i.n-project\index.php on line 81


...e o estranho é que se eu fizer com o echo para a página, copiar e substituir pelo $page ele já faz o pedido (só para a página em questão)!

 
O problema está nas plicas em $pages e .php.

E, como diz o brazuca, estás a abrir um buraco gigantesco na tua aplicação. NUNCA se faz include de variáveis não tratadas.
 
Como disseram acima, isso provoca uma falha de segurança enorme. E se $page = "../settings"? Ele faz include de "pages/../settings.php". Quem diz "settings" diz outro ficheiro qualquer.

É fácil dares evitares isso:
PHP:
if(!is_numeric($pag)) die("Erro.");
$page = "pages/" . $pag . ".php";
    //echo $page;
    include($page);

Em princípio deve chegar, e este código deve funcionar.
 
E portanto a solução é só permitir páginas do tipo 1.php, 10.php, 1209743.php ?
Que tal
PHP:
if (!preg_match('/^\w+$/', $pag)) die('Buraco tapado.');
...
?
 
É o normal, quando alguém mete a página no url :P
Se ele quer aceitar caracteres alfanuméricos, então isso serve, mas se ele apenas vai usar números, é preferível verificar com o is_numeric() do que usar regexps. Apenas depende daquilo que ele está a pensar usar.

edit - eish, esquece, troquei-me todo. Tens toda a razão.
Pensei em páginas do tipo "página 1 de 10", e não em páginas do tipo Home, Quem somos, Contactos..., daí aquela proposta.
 
Última edição:
Back
Topo