NoScript: ¿seguridad paranoide?

NoScript LogoPuede que muchos no estén de acuerdo con lo mi opinión sobre la extensión de Firefox NoScript pero, y aunque desde el punto de vista de la seguridad puede ser realmente interesante, me crea un problema que no necesito.

Esta extensión permite filtrar absolutamente todos los Javascripts de una página. Funciona a través de una lista blanca a la que se van añadiendo páginas conforme las vamos visitando y autorizamos sus scripts. Todo esto se hace por dominios de modo que si una página, por ejemplo carga un script de estadísticas de otro dominio, pues tenemos que autorizar cada uno de los dominios. Y el caso contrario. Por ejemplo, si autorizamos estas estadísticas y vamos a una web que no hemos visitado, solamente se ejecutará este script.

Además, ofrece cierta protección adicional contra ataques de XSS (ya que limita los dominios de ejecución, se puede decir que imposibilita estos ataques) y incluso añade algún parche que el propio Firefox aun no implementa. En resumen, desde el punto de vista de la seguridad es realmente valiosa: ejecutamos solamente los Javascripts de los dominios en los que confiamos.

Y hasta aquí las que considero que son las bondades de esta extensión. Pero tiene un gran inconveniente: es molesto. Sus fans dicen que total, siempre navegamos por los mismos sitios y que al final acabas teniendo una bonita lista blanca con lo que en general no molesta. Y además puedes eliminar el aviso de bloqueo de scripts en la parte inferior y ya ni molesta. Pues no: molesta, molesta y molesta.

Me paso el día visitando nuevas webs, descubriendo nuevos blogs, haciendo búsquedas en Google que me llevan a sitios insospechados y cada vez que llego a un sitio nuevo: scripts bloqueados. Dale al botoncito y autorízalos. Después espera a que la página vuelva a cargarse de nuevo con la nueva configuración. Y así sucesivamente.

Por otro lado, como creador de contenidos para web, me gusta que la gente vea las cosas tal y como yo he pensado que las vean. Vale que esto es complicado con la gran cantidad de navegadores y dispositivos que hay pero francamente, me esfuerzo en hacer bonitas páginas, aprender a usar técnicas AJAX, empaparme los diversos frameworks, probar en múltiples configuraciones, etc… para que luego al final entre alguien con el Javascript desactivado y se vaya todo al garete. No, no me gusta.

Igual no lo he configurado correctamente pero vistas las quejas y las justificaciones de sus seguidores, creo que está funcionando correctamente. En definitiva: no lo volveré a instalar. Puedo asumir los riesgos.

Enlace: NoScript Firefox Extension

Cambio dinámico de Google API Key

Todo el que haya usado las APIs de Google sabrá que hace falta una API Key para poder usarlas. Esto en principio no es un gran inconveniente pero es realmente molesto que haya que generar una clave por cada dominio que queramos usar, ya que a veces publicamos páginas en más de un dominio a la vez.

Si la página es dinámica, no hay mayor problema: se mira el dominio en alguna variable del servidor que seguro que está a nuestro alcance y se selecciona la API Key correspondiente para usarla en el HTML generado. Hasta aquí ningún problema, pero ¿qué ocurre cuando son páginas estáticas solamente? Pues la cosa se complica.

La primera solución que he probado era usar el DOM para crear un elemento script y meterlo directamente en el head de la página, seleccionando la clave usando document.domain, pero esto no ha resultado: en Internet Explorer no había manera de hacerlo funcionar. No se reconocen las funciones que carga el Javascript de Google internamente. Un desastre….

Pero luego buscando por ahí he descubierto el AJAX API, con lo que se pueden cargar todas las APIs de Google vía código. Y luego buscando por los foros, una función no documentada: .ApiKey, que permite seleccionar la clave a posteriori. Así que ya lo tenía todo y me he puesto manos a la obra:

var key = '';

switch(document.domain)
{
    case 'www.dominio1.com':
        key = 'ABQIAA....';
        break;
    case 'www.dominio1.biz':
        key = 'ABQIAB....';
        break;
}

google.loader.ApiKey = key;
google.loader.KeyVerified = true;   // por asegurarnos
google.loader.LoadFailure = false;  // por asegurarnos

google.load("maps", "2.X");

google.setOnLoadCallback(load);

Primero se selecciona la clave a través de un simple switch y luego se carga la API usando .load. Finalmente se llama a .setOnLoadCallback() indicando la función que se llamará cuando termine la carga de los datos.

Y básicamente eso es todo. Lo he probado en Mozilla y Explorer pero supongo que funcionará en algunos más porque usa código de Google que probablemente es mucho mejor que el mio. De todos modos, como usa una función no oficial de la API, es posible que esta técnica deje de funcionar en el futuro.