PHP: include seguros

Me canso de ver a menudo aplicaciones web o scripts que hacen cosas como esta:

<?PHP
$sPagina = $_GET[‘pagina’];
include ($sPagina);
?>

Eso es lo que yo llamo una aberración de seguridad. Al menos algunos se toman el trabajo de “limpiar” $sPagina, igualmente para mi gusto, sigue siendo peligroso por el solo hecho de estar mostrando algo de la estructura interna de nuestra aplicación.

La idea es que, cuando quieras incluir una “página” o archivo dentro de tu script “a petición”, es que trates de darle la menor cantidad de información posible a quién está del otro lado (cliente). Hay muchos métodos, pero básicamente te recomiendo dos: utilizar un diccionario, o codificando la petición.

Utilizando un diciconario

En este caso te valés de un array. Este ejemplo es para cuando tenés un número conocido de páginas.

<?PHP
// Tienes el array con la lista de páginas a cargar
$aPaginas = array(0 => 'index.php', 1 => 'acerca-de.php', 2 => 'servicios.php', 3 => contacto.php);
// Tomas el parámetro "pagina" que viene por GET y lo transformas a un entero
$iPagina = (int) $_GET['pagina'];
// Validación
if (!isset($aPaginas[$iPagina])
{
// La petición es incorrecta. Están tratando de cargar una página que no existe
// Puedes directamente "matar" la petición con un die('Solicitud incorrecta'); o mandarlos
// a la página por defecto: index.php que está en el índice 0;
$iPagina = 0;
}
// La petición es válida
include($aPaginas[$iPagina];
?>

Codificando la petición

El ejemplo es para cuando no tenés un N° conocido de páginas, así que lo mejor es codificar de alguna forma (más simple o más compleja) la petición. La idea es que los archivos a incluir los tengas en un directorio, y bajo este, los directorios que quieras. De esta forma te asegurás de incluir solo archivos de ese lugar (directorio base).

Cuando me refiero a codificar no me refiero a “encriptar” (aunque se puede hacer) sino más que nada a ocultar detalles de la implementación. Por ejemplo evitar peticiones de path’s absolutos a nuestros archivos para que no conozcan los directorios, el document root, y demás.

Supongamos que tenemos nuestros includes organizados en:

/fichas/rubro01/producto0001.php
/fichas/rubro02/producto0001.php
/fichas/rubro03/producto0001.php
/fichas/rubro03/producto0002.php

Sabemos entonces que, todos nuestros includes, están organizados dentro del /fichas. También tenemos un patrón en el nombre de la segunda carpeta, donde el nombre es igual a “rubro” + NN (código del rubro). Y la ficha en sí, que está dentro de la carpeta rubroNN; tiene la forma “producto” + NNNN .php

Entonces, una forma de ocultar nuestra implementación es utilizando estos patrones, y recibiendo como petición solamente el código del rubro y del producto, datos suficientes para “deducir” que ficha queremos incluir en nuestro script.

Podríamos usar dos parámetros: rubro y producto, pero mejor usamos uno solo y separamos el rubro del producto con un caracter, por ejemplo el “.” (punto). Así, nuestro request va a ser pagina=1.1 (rubro 1, producto 1).

<?PHP
// Este es el directorio base
$sDirBase = '/fichas';

// Recuperamos la página que se pide
$sPagina = (string) $_GET['pagina'];

// Siempre en $sPagina esperamos el código del rubro más el código del producto separados por un punto. Validamos este patrón con una expresión regular.
if (preg_match("/^\d{1,2}\.\d{1,4}$/", $sPagina))
{
// La expresión regular validó. Proceso el request $sPagina
$aPagina = explode('.', $sPagina);
// Armo el nombre de nuestro archivo a incluir
$sPagina = '/rubro' . str_pad($aPagina[0], 2, '0', STR_PAD_LEFT) .
'/producto' . str_pad($aPagina[1], 4, '0', STR_PAD_LEFT) .
'.php';
// Listo... ahora lo incluyo con toooda seguridad :)
include ($sDirBase . $sPagina);
}
else
{
// Falló la validación de la expresión regular
}

?>

Es muy simple y muy fácil. Y muy seguro. Espero que sirva.

Optimizar tus aplicaciones/scripts de PHP

Hay miles de artículos que explican como optimizar una aplicación. Desde los básicos que te hablan del sentido común que hay que tener cuando programás (optimizar estructuras, uso de variables, etc) hasta las específicas por como está implementado el lenguaje.

Encontré este artículo “40 Tips for optimizing your php Code” (40 consejos para optimizar tu código PHP), que la verdad es muy interesante. Y me tomo el trabajo de traducir algunas de las que me parecieron sumamente curiosas e importantes.

Continúa leyendo Optimizar tus aplicaciones/scripts de PHP

Configurar varios sitios con XAMPP en Windows

XAMPP es una distribución que te permite instalar a golpe de un solo click, el Apache, PHP, MySQL, Perl y algunas otras extensiones útiles para el desarrollo web.

Voy a asumir que ya tienes instalado y funcionando el XAMPP en tu PC. Por ahora, solo puedes acceder al sitio web por defecto en XAMPP que ha sido creado en la instalación bajo http://localhost

En el mundo del desarrollo web es súmamente importante ser organizado, y con ello, saber organizar sus proyectos, carpetas y archivos (en este orden).

Y también, sería interesante poder probar nuestros proyectos individualmente en la misma carpeta en donde desarrollamos, por ejemplo:

http://miproyecto/

Y no tener que recurrir a:

http://localhost/miproyecto/

Aparte de esto, la primera opción nos permite tener un mejor control de cada proyecto, de los archivos, etc. Mienstra que con la segunda forma, todos los archivos deberían ir a parar a una carpeta predeterminada del XAMPP.

Continúa leyendo Configurar varios sitios con XAMPP en Windows

Volviendo a programar como antes

Me acuerdo que cuando comencé a programar, allá por el 1996 con Basic, se cuidaba cada línea de código, cada variable, cada campo para que no ocuparan más espacio del que se debiera. Recuerdo armar las estructuras de los archivos para que sean lo más pequeño posibles, por dos razones: espacio en disco, y la memoria del sistema.

Sin embargo, con la aparición de máquinas más potentes, megas y megas de memoria RAM y grandes discos, eso parecía que dejó de ser un problema. Las aplicaciones de escritorio se destacaban por la cantidad de líneas de código, variables, imágenes y cuanta cosa quisieras ponerle a tu programa.

He visto código fuente que sinceramente es para llorar. Eficiencia 0. Al hacer la crítica simplemente te contestaban que no era necesario optimizar tanto la cosa porque con el hardware disponible hoy en día, el programa corre sin mayores problemas.

Sin embargo, en el campo en el que estoy trabajando, la web, la optimización del código fuente es la clave para que tu sitio web sobreviva o no. Sobre todo si tienes una alta demanda. Asi que hoy tienes que considerar muy bien el tema de la programación orientada a objetos, usar plantillas, separación del código, etc. Simplemente porque cualquier “cosita” demás, hará que tu aplicación simplemente colapse, o tendras que irte a un servidor dedicado.

Hace un tiempo empecé a utilizar Smarty en mis proyectos. La verdad es que es fantástico, pero me parece que es redundante. Tranquilamente puedes montar las plantillas con código PHP, y te ahorras de aprender un nuevo seudo-lenguaje como el que implementa Smarty.

Estoy de acuerdo con lo que comenta Ricardo Galli en su blog con respecto a las plantillas: no son soluciones máginas. Si puede que te hagan un poco la vida más fácil, pero no más que eso y su precio (que a veces puede ser demasiado caro).

Igualmente en mis proyectos uso plantillas en algunos casos, como en TuSecreto, por la simple razón que uso un core para toda la aplicación, que es usado por cada uno de los sitios de TuSecreto, y para manejar la presentación visual uso plantillas en PHP que manejo con includes.

En otros proyectos simplemente no uso plantillas. Incrusto mi código PHP directamente en la página PHP, obviamente sin hacer esas mezclas que puedes encontrarte en PHP Nuke (lo peor que he visto hasta ahora). Básicamente procuro tener dos capas:

  • Capa de Procesos: El código que maneja todos los datos, consultas, procesos, etc.
  • Capa de Presentación: El código para la presentación visual, o sea las páginas en sí.

Mi política, es que el código de la Capa 1 no tenga nada que ver con el HTML. Ninguna de mis funciones te vuelve algo en HTML. Cuando más, en XML, pero nada más que eso. De eso se encarga la Capa de Presentación.

La Capa de Presentación se maneja con muchos includes, cache de objetos (para casos puntuales) y compilación de CSS y JS (para que usen menos espacio o vayan compactados al cliente).

Y así es como me manejo. Ni más ni menos.

Eclipse, el editor para programadores.

Logo EclipseHace unos años instalé Eclipse y no me gustó… bah… quise instalarlo pero era un dolor de (…) cabeza hacerlo andar con todos los chiches… asi que seguí con mi editor habitual.

Eclipse es un IDE (Entorno de Desarrollo Integrado) con el que podés trabajar en prácticamente cualquier lenguaje y está desarrollado íntegramente con JAVA. En principio fué un proyecto de IBM y luego pasó a la comunidad OpenSource bajo el nombre de Fundación Eclipse.

Eclipse es un sistema modular por lo cuál resulta ser una plataforma extensible y configurable para una gran cantidad de entornos y lenguajes de programación. Si querés conocer más, te recomiendo que leas la página de Eclipse en la Wikipedia.

Continúa leyendo Eclipse, el editor para programadores.

Comparativa: Variables, constantes y arrays en PHP

Bueno, ya que no pude encontrar nada en Google que me dijera a ciencia cierta que si era más eficiente usar constantes, variables o arrays en mis scripts, más que nada para todo lo que sea un valor “inmutable” a lo largo del script, decidí hacer una comparativa y acá están los resultados:

Continúa leyendo Comparativa: Variables, constantes y arrays en PHP