Newsgroup: it.comp.www.php
Titolo: E' sicuro includere pagine col get?

quant'è è sicuro includere le pagine in questo modo?
$pagina = urldecode((string)@$_GET['pagina']);
$paginaEsiste = file_exists($pagina.'.php');
if($paginaEsiste){
	require_once($pagina.'.php');
}else{
	require_once('homepage.php');
}
grazie anticipatamente

 quant'� � sicuro includere le pagine in questo modo?
Poco, MOLTO poco.
Enrico

quant'� � sicuro includere le pagine in questo modo?
In PHP 4, non molto (puoi includere file al di fuori della web root, anche
se solo con estensione .php).
In PHP 5, per niente (FTP ed HTTP potrebbero ritornare TRUE anche per file
non locali - consentendo a terzi di eseguire il proprio codice all'interno
del tuo server).
Come minimo, valida la stringa in modo che contenga solo lettere, numeri e
puntini, trattini e slash, rifiuta due puntini consecutivi, aggiungici una
"./" all'inizio e un ".php" alla fine.
Attenzione - io ho detto POTREBBERO. In genere file_exists NON DEVE essere
usata per verificare se un URL remoto esiste, perche' POTREBBE anche darti
errore. Alternative si trovano qui: 
http://it.php.net/file_exists
Leonardo
-- 
Linten addie toorin addie,
Linten addie toorin ee,
Linten lowrin lowrin lowrin,
The barnyards of Delgaty

 quant'� � sicuro includere le pagine in questo modo?
E' sicuro che apri la porta ad hackeraggi vari.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Greetings, professor Falken.

 quant'� � sicuro includere le pagine in questo modo?

ti conviene fare:
$pages = Array("pippo.php", "pippa.php", "index.php");
e poi al posto di file_exists
if in_array $pagina, $pages
else
die
/if
-- 
have you tried turning off and on your computer?

 quant'� � sicuro includere le pagine in questo modo?

� pi� sicuro fare una hash map delle pagine sicure esempio:
$pagine_sicure['download'] = 'download.php';
$pagine_sicure['guestbook'] = 'guest.php';
.
.
.
$pagine_sicure['galleria'] = 'gallery.php';
$pagina_da_includere = (isset($pagine_sicure[$_GET['pagina']])
    ? $pagine_sicure[$_GET['pagina']]
    : 'homepage.php';
require_once($pagina_da_includere);

grazie a tutti per le risposte.
La soluzione di inserire in un array le pagine sicure l'avevo pensata
anch'io, ma l'ho subito scartata perché il sito in questione ha
davvero tante pagine ;).
Quindi quali soluzioni alternative - rispetto al get -  mi
consigliate?
L'unica che mi viene in mente è questa
include('header.php');
include('mia_pagina.php');
include('footer.php');
Alte soluzioni?
grazie ancora per le risposte

 davvero tante pagine ;).
Mettile in un database e referenziale con un ID.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
One man's Windows are another man's walls.

> Mettile in un database e referenziale con un ID.
a questo punto preferisco metterle in un array almeno mi risparmio una
query. ;)

 query. ;)
Se sono cosi' tanti, non e' detto che sia un risparmio perche' c'e' una buona
probabilita' che il dato sia gia' nella cache del database engine quando PHP fa
la query, mentre se metti tutto in un array ti occupa memoria di PHP in maniera
costante.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
We're not surrounded, we're in a target-rich environment!

 query. ;)
è solo che mi stancherei ad inserire manualmente le pagine nell'array,
potrei scrivere una una funzione che faccia questo al posto mio, ma
nell'array andrebbero a finire pagine che vengono incluse in altre e
quindi pagine che non andrebbero aggiunte nell'array. Per questo sto
cercando altre soluzioni



 
<?
// ovviamente va cosato
switch($_GET[pg]){
  case 1:
     include("paginachevuoi.php");
  break;
  case 2:
     include("paginachevuoi2.php");
  break;
  default:
      include("home.php");
  break;
}
ovviamente uo diventare anche piu performate
toglinedo tutto l'inutile (indentature)
con ajax diventa una cosa tosta

 


 require_once($cartella/$pagina.'.php');
era per avere un controllo stretto e volendo anche un alias, in quel
modo non era vincolante che l'id passato fosse uguale al nome del file e
permetteva di avere nella stessa directory file che possono essere
inclusi ed altri no, dipende un p� dalla situazione a monte...

 :)
ehm non era per polemizzare sia quello di usar� un array oppure una
directory sicura sono soluzioni da manuale :)

grazie ancora per le risposte.
Per adesso sarei più propenso ad utilizzare la soluzione di Magilla,
anche perché quella di michelangelo giacomelli comporta sempre
l'inserimento manuale di un case per ogni pagina.
Ma per quanto riguarda l'utilizzo di una directory sicura, questo
sistema è davvero sicuro?
Se io setto come dir sicura
$cartella="admin"
require_once($cartella/$pagina.'.php');
ma poi tramite GET qualcuno mi imposta come pagina "
http://www.url.php/
pagina=../altroFile" non mi ritroverei nella stessa situazione
iniziale?
Quindi per rendere il tutto più sicuro dovrei :
1- impostare una directory
2- controllare se la pagina passata tramite GET sia prima di punti,
doppi punti e slash
giusto?

 ($cartella)
questo codice adesso è sicuro oppure ho dimenticato qualcosa?
// dir sicura settata
$safeDir = 'user/';
// controllo se la pagina è  stata passata
$pagina = ( isset($_GET['pagina']) && !empty($_GET['pagina']) ?
urldecode((string)$_GET['pagina']) : false );
// elimino dalla pagina i caratteri pericolosi
$pagina = str_replace( array('http', ':', '.', '/', '\\'), array(''),
$pagina );
// controllo se realpth($safeDir.$pagina.'.php') corrisponde a realpath
($safeDir) e se la pagina esiste restituisco true
$paginaEsiste = ( strpos(realpath($safeDir.$pagina.'.php'), realpath
($safeDir)) == 0 && $pagina != false ? true : false );
if($paginaEsiste)
	include($pagina.'.php');
else
	include('home.php');


raga anche a me interessa, potreste rispondere ?
grazie