Archivo de Octubre 2007|Página de archivo por mes

Cuando los Bugs Terminan en Explosiones

Quizá un título un poco Simpsons, pero cualquiera que haya programado alguna vez sabrá que hacer un programa sin ningún tipo de bug (partes del programa que no funcionan adecuadamente); pero lo que quizá no tengamos en mente muchas veces es que hay veces que los bugs pueden acabar en explosiones.

Un poco de historia de explosiones causadas por bugs.

1962: El Mariner 1 tenía como misión el viaje hasta Venus, pero el lanzamiento no salió como se esperaba. Primero se produjo un fallo en las comunicaciones con los sistemas de tierra, por lo que el cochete entró en modo automático. El problema era que el sistema de guiado tenía un bug. Parece ser que se vuelve a cumplir esta frase célebre de "me llevaba una". En este caso, había un fallo en la transcripción de las ecuaciones de guiado de la pizarra al programa (toma especificaciones!) y alguién se olvidó de meter la media.

El programa por tanto, actuaba con las variaciones de los valores, no con la media de estas variaciones lo que hizo que una pequeña desviación fuera considerada un gran problema y por tanto era necesario introducir grandes correcciones en el vuelo. La aventura terminó con la orden desde el centro de control de destruir el cohete como media de seguridad.

1991: Una batería de misiles Patriot no consigue adquirir como blanco un misíl Scud resultando en la muerte de 28 personas. El culpable, otra vez un bug en el programa. Básicamente, el error en la posición de un objeto en el radar tenía un error acumulativo. A las 100 horas de operación del sistema el error era tan grande que aunque se detectaba un objeto en el radar, no se sabía dónde tenía que ser interceptado.

1996: El Ariane 5, quizá uno de los fallos informáticos más conocidos de la historia se dispone a despegar. Pero poco después de la ignición, dentro del sistema de guiado se quiso utilizar una variable de 64 bits como parámetro de un método que operaba con variables de 16 bits procedente de una misión anterior. El resultado buffer overflow, halt del programa y explosión.

1998: El Mars Climate Orbiter es lanzado con la misión de llegar a Marte, desintegrándose en la entrada en la atmósfera. El problema, parte del software realizado en un sitio esperaba unidades métricas y el componente software que las sumistraba lo hacía en unidades imperiales. Por tanto, la velocidad y órbita de entrada en la atmósfera eran erróneas.

Supongo que al menos, a partir de ahora quizá pensemos distinto sobre las consecuencias de un bug en un programa :) Tampoco hay que ser alarmante, ya que depende mucho del dominio del programa (no todos hacemos programas para cohetes), pero tampoco bien mal pensar sobre ello.

Referencias:

  1. Mariner 1 en Wikipedia
  2. Lanzamiento Ariane 5 en Youtube
  3. Mars Climate Orbiter en Wikipedia
  4. Incidente Misiles Patriot

Historia de las Cookies

Supongo que es habitual el dar por supuesto la existencia de ciertas tecnologías porque básicamente están tan extendidas que nunca se repara en ver de dónde vienen.

En este caso, el post va dedicado a las cookies. Una cookie para los que no estan familiarizados con el tema es básicamente información que un servidor web puede pedir que se guarde en el navegador cliente. Este tipo de información se envía con las peticiones y respuestas cuando se solicita una página Web.

El origen de esta tecnología nace de la idea de uno de los programadores de Netscape llamado Lou Montulli. Creo que en este punto es mejor meter una cita de la propia web personal de esta persona.

I’m largely to blame for several innovations on the web including, cookies, the blink tag, server push and client pull, HTTP proxying, proxy authentication, HTTP byte ranges, HTTPS over SSL, and encouraging the implementation of animated GIFS into the browser.

Creo que es una de las frases más fantásticas dentro de un currículum "soy el culpable de …" :) Y ¿por qué? Básicamente, las cookies son unos mecanismos que han sido absolutamente abusados como solución a ciertos problemas dentro de cómo hacer algo dentro de una aplicación y han sido (y lamentablemente todavía se puede ver) los culpables de muchos fallos de seguridad dentro de los sistemas.

El ataque más simple que se puede describir basado en cookies se da cuando estas se utilizan como mecanismo de autenticación. Un usuario escribe su nombre y contraseña para acceder al servicio y el servicio por debajo guarda una cookie que básicamente guarda el ID (identificador) de sesión del usuario. Ataque típico copy & paste, ya que copiando la cookie a otro ordenador se puede acceder a los servicios en los que esta acreditado el usuario.

Referencias:

  1. Especificación original del mecanismo de cookies
  2. Página personal de Lou Montulli. Recomendable 100% los archivos de las discusiones sobre los formularios en HTML.
  3. RFC 2109 que define el mecanismo actual de cookies.

XSS: Cross Site Scripting – ¿Cómo evitarlo?

En un post anterior, hablaba de tipos básicos de ataques de XSS, la pregunta que normalmente aparece en la mente después de leer eso es ¿cómo lo evito?En general, y dada la importancia de estos ataques, la mejor defensa es una buena prevención. Esto aunque suene quizá a "muy buenas prácticas" es verdaderamente un hecho. La idea fundamental para evitar XSS es:

Todas las entradas proporcionadas por el usuario deben de ser validadas antes de ser utilizadas.

Pero como la idea fundamental habitualmente es olvidada, creo que un checklist es mucho más clarificante. Decir que como siempre, el checklist contiene una serie de puntos que pueden ser comprobados, pero no pretende ser una lista completa ya que muchas cosas dependen de tecnologías web concretas, simplemente unos primeros sitios por donde empezar.

  • Bases de datos

    • Evitar que se puedan ejecutar más de una sentencia SQL en un mismo comando.
    • Utilización de Prepared Statements: ¿Y eso qué es? Básicamente el término prepared statement hace referencia a un tipo de consultas SQL que no se ejecutan concatenando cadenas de caractares.El funcionamiento es primero construir el esqueleto de la sentencia SQL y luego decir qué parametros van en cada punto.

      De esta forma el ejemplo anterior quedaría:

      SELECT identificadorFROM usuariosWHERE username = ? AND password = ?

      Ahora sólo quedaría decir qué es cada uno de los parámetros, lo importante es que en esta operación se dice de qué tipo son los mismos, por lo que por ejemplo introducir un número cuando se espera un cadena daría error. En Java por poner un ejemplo, se realizaría con:

      preparedStatementObject.setString(1, "usuario");
      preparedStatementObject.setString(2, "contraseña");

    • Comprobar las entradas aunque hayan sido comprobadas en la parte cliente. El objetivo sería prevenir posibles problemas relacionados con buffer overflows.
  • Servidores o Aplicaciones Web

    • HTTPS no evita XSS. HTTPS es un protocolo que asegurará que la conexión entre el servidor y el cliente es segura, pero no asegura nada de los datos intercambiados.
    • Filtrado de código HTML que se permite introducir por los usuarios. Esto es especialmente problemático en componentes encargados de los comentarios en un blog o foro.
    • Se puede utilizar un pre-filtrado en código cliente (que será ejecutado en el navegador del usuario), pero sólo como medida adicional de prevención.
    • Evitar utilizar sólo parámetros que viajan con la página para autenticar un usuario. El ejemplo más típico es que aunque exista un parámetro &ID=[cadena de caracteres], eso sólo debe ser utilizado como media adicional
    • En ocasiones sería recomendable comprobar el campo REFERER de la petición HTTP para saber de dónde viene una petición, pero también hay que tener en cuenta que es un campo opcional.
    • Evitar filtrar por codificaciones, este ejemplo quizá parezca bastante absurdo, pero se dan casos donde por ejemplo se filtra por ejemplo un tag que contenga javascript, pero no se filtra jav[caracter x09]ascript y a efectos prácticos es lo mismo.

Y aquí acaba la introducción a XSS, espero que al menos no haya resultado excesivamente técnico :) Como comentario final, simplemente añadir que al final lo mejor es estar al tanto de los ataques que se realizan. El tema de seguridad, siempre es un mundo que se mueve deprisa y en el que algo que se hacía hace un año o 1 mes, es muy probable que ya no tenga validez.

Referencias:

  1. Tutorial Prepared Statements en Java
  2. XSS Cheatsheet con ejemplos varios
  3. XSS: Cross Site Scripting – ¿Cómo se hace?
  4. XSS: Cross Site Scripting – Introducción

Java 6 en Leopard = WTF

La verdad, creo que ahora sí que siento algo de cabreo en el mismo nivel que en mis tiempos en Windows. Todo comienza al intentar instalar la versión 6 del JDK de Java. En Tiger (versión anterior del SO), el proceso era básicamente ir al Apple Developer Connection y bajarse JavaSE6Release1.pkg para instalarlo.

El problema es que ahora no existe tal paquete en el Apple Developer Connection, los últimos paquetes disponibles para su descarga hacen referencia a actualizaciones de J2SE 5.0, por lo que ahora mismo no es posible localizar un instalador de Java 6.

Creo que esto es altamente inaceptable, y espero que se solucione pronto. En un principio me he puesto en contacto con Apple Developer Connection, con Apple Support y con Sun y estoy a la espera de noticias, por lo que iré actualizando el post a medida que conozca nuevas cosas.

PS: No creo que nunca más sea un early-adopter de nuevas versiones, al final es mejor esperar una semana o dos y ver qué efectos tienen la novedades :(

Actualización: ¿Quién es el culpable?

He estado viendo cosillas por Internet y al final, creo que hay algo que no esta claro, la víctima en este caso es el usuario o mejor dicho desarrollador que se ve sin su entorno deseado, pero ¿quién es el culpable? Por un lado, se podría decir que Apple por no dar la opción de instalar Java 6, pero por otro lado, Apple se encarga de sus productos como cualquier fabricante. ¿No sería Sun? La verdad es que en este punto no se a quién determinar como culpable. Tampoco me parece lógico que Sun se olvide de Mac en su página de descargas (no he encontrado ninguna referencia a MacOsX tanto Tiger como Leopard). ¿Opiniones?

Actualización: Información de Apple

Parece que con el perfil actual que tengo dentro del Apple Developer Connection, no es posible acceder a los denominados Software Seed Keys, qué básicamente vienen a ser una forma de tener acceso a versiones pre-release de distintos software. Así por tanto, espero que en un futuro próximo sea posible a la descarga de Java 6 con el perfil normal. Tampoco sé realmente si existe un pre-release de Java 6, es simplemente una suposición, ya que todo el tema del ADC esta bajo aceptación de licencias de confidencialidad y por tanto la información esta bastante limitada. En fin, al menos he recibido respuesta de Apple, que a mi parecer no es poco.

Leopard – Primeros Problemas

Supongo que al final no puedo evitar cierta mala suerte con la tecnología, pero bueno, al menos parece solucionado. Ayer, después de escribir el post anterior, estaba trabajando con varios programas abiertos y algo raro empezó a pasar :(

Los síntomas:

  • Ralentización de las operaciones hasta el punto del cuelge de aplicaciones.
  • Aparente reinicio del finder, sin poder recuperarse completamente.
  • Al reiniciar el ordenador, muchísimo tiempo de espera hasta el arranque, todo a cámara lenta.

La solución:

Bueno, después de intentar ver qué estaba pasando y a la vista de los problemas que había tenido hace algunos días en Tiger (versión anterior del sistema operativo), he decido hacer una instalación desde cero (clean install en inglés).

Los pasos para llevar a cabo la misma son:

  1. Hacer copia de seguridad de toda la información que tenemos en el sistema.

    1. Documentos, Música y Películas
    2. Exportar las entradas de la Agenda y los favoritos del navegador a XML.
    3. Ir a /usuario/libreria/Application Support y copiar los datos que necesitemos de los programas que queramos volver a instalar recuperando información.
  2. Introducir el DVD de Leopard y pulsar instalar.
  3. Después de aceptar las condiciones de la licencia, en la pantalla donde se pide seleccionar el disco duro en el que se instalará el SO, aparece un botón de Opciones. En ese botón de opciones, seleccionar la operación de Instalación desde cero, es decir, la que borra todos los datos anteriores.
  4. Esperar a que se instale Leopard :)
  5. Instalar las aplicaciones anteriores y a seguir funcionando.

Con esto aparentemente el sistema ha vuelto a la normalidad, se nota fluidez en las operaciones y de momento ningún problema (espero estar un tiempo sin ellos). Por último unos apuntes para los que tenían Tiger

Instalación de iLife desde el dvd de Tiger:

  1. Introducir el DVD número 1 de Tiger. (Esta en el paquete "Todo lo demás" que venía con el Mac)
  2. Seleccionar Install Bundle Software Only
  3. Seleccionar en el asistente los programas que queremos instalar iPhoto, iWeb, GarageBand, etc.
  4. Esperar a que se instale :)

Leopard – Primeras Impresiones

Pues después de llevar escasamente un día con el nuevo Leopard (pronunciado teóricamente \ˈle-pərd\), voy a describir las primeras impresiones de los cambios principales que obviamente saltan a la vista los primeros. Lo primero es señalar que hay muchos más cambios de los aparentemente se notan, pero bueno, esto ya lo trataré en otros post.

  • Safari: Versión finalmente 3 del navegador que la verdad mejora ampliamente a su predecesora. Entre los cambios más notables se encuentran:

    • Búsqueda dentro de las página web mejoradas, básicamente se señalan en primer plano las ocurrencias de la búsqueda.
    • Coherencia a la hora de realizar el render (pintar por pantalla) de los botones de una web.

  • Finder: Nueva versión que se basa en la forma de mostrar datos de iTunes, es decir, existe una barra a la izquierda de la pantalla con accesos rápidos a qué se quiere mostrar.

    • Coverflow: La verdad es que va bastante fluido y el poder ver el contenido de un archivo sin tener que abrir la aplicación que lo creo mediante Quicklook es bastante útil.
    • Dock: A parte de las mejoras visuales, me ha gustado especialmente el tema de stacks y la carpeta de descargas.

  • Aqua: La interfaz o mejor dicho el formato en el que se muestran las distintas pantallas del sistema ha ganado un punto más en cuanto a la coherencia entre las mismas. Parece un cambio simple, pero llevaba bastante tiempo sin ser solucionado.

    • Menús en pantalla: Se ha modificado el aspecto de todos los menús que se muestran por pantalla para darles un aspecto más suavizado.

En resumen, bastantes cambios que ya iré comentando en próximos post.

Leopard Ya esta Aquí!

Pues sí, desde hace unos pocos minutos estoy escribiendo este mail desde Safari desde Leopard. La verdad, ha sido una actualización genial. Simplemente meter el dvd, se pide reiniciar el ordenador y desde ese punto lo único que hay que hacer es seleccionar el idioma y aceptar la licencia. Una vez hecho esto, la instalación se lleva a cabo de forma automática y en cosa de aproximadamente una hora, el ordenador se vuelve a reiniciar y ya estamos en leopard. La verdad, de momento no puedo contar mucho más, porque como ya he comentado, llevo como 10 minutos en Leopard, así que lo mejor es dejar unas fotografías del paquete donde viene el dvd. La presentación esta muy bien conseguida y básicamente contiene:

  • DVD con Leopard, no podía faltar :)
  • Manual de instrucciones de cómo instalar y descripción de las funcionalidades nuevas más relevantes.
  • Set de 2 pegatinas de Apple con la típica manzana.

Como último apunte, Leopard cuesta 129€ y esta disponible en los sitios habituales. Yo concretamente, lo he adquirido en la Fnac de Parque Sur.  
  

Xkcd: Comics para informáticos

Mucha gente conocerá y será lectora de las grandiosas tiras de Dilbert. Pero lo que igual no sepan es que existen más tiras con temas relacionados en ocasiones a la informática.

En concreto, este post va dedicado a Xkcd. Quizá no tenga tanto throughput (número de viñetas a la semana), pero sí que se encuentran auténticas maravillas de vez en cuando. Supongo que algunos de los que me lean habrán visto la famosa viñeta del sudo make me a sandwitch, una viñeta que salió hace algún tiempo y representa el tipo de humor utilizado en las viñetas.

Tengo que decir, que las viñetas no se limitan únicamente a temas de informática o empresa como en Dilbert, sino que de vez en cuando también se hablan de otros temas: religión, vida, etc.

En fin, supongo que este tipo de post necesita viñetas, por lo que dejo una selección de las últimas viñetas que me han parecido curiosas, eso sí encabezando la recopilación por la mencionada anteriormente.

Variables Foo y Bar

Es habitual encontrar como nombres de variables sobre todo en tutoriales y demás los famosos foo y bar, pero de verdad alguien se ha preguntado alguna vez ¿de donde viene ese nombre?

Pues la respuesta es cuando menos curiosa. Básicamente parece que el nombre de las variables foo y bar viene de un expresión de la Segunda Guerra Mundial y proviene de la expresión FUBAR (Fucked Up Beyond All Recognition / Repair / Reason / Redemption).

Lo bonito es la de veces que se emplean estos nombres incluso en publicaciones de cierto prestigio. En fin, una curiosidad más del mundo informático, donde las bromas pueden estar implícitas en cualquier expresión.

Además por si fuera poco, he encontrado un grandioso RFC 3092 que se encarga de definir ambos términos y tiene un listado de su uso en los distintos RFC que existen.

Esto me recuerda al también famoso RFC 1149, que define como enviar paquetes IP utilizando palomas como medio de transporte :)

Actualización:

Siguiendo con los RFC, acabo de encontrar la actualización del RFC de IP sobre palomas. Es el RFC 2549 e introduce el concepto de QoS (Quality of Service).

Nueva Categoría: Programación

Nueva categoría que incorporo al blog para tratar temas que esten relacionados con la programación ya sea sobre lenguajes de programación, herramientas, entornos de desarrollo o cuestiones relacionadas.

Entradas siguientes »