Desactivar el bloqueo de SSLv3 en Firefox

A partir de Firefox 34 el popular navegador libre bloquea el acceso a todas las páginas que usen SSLv3 por ser un protocolo de seguridad roto. ¿Cual es el problema? Que hay routers, por ejemplo los de fibra optica de Telefónica, que usan este protocolo para el acceso a su página de administración, así que si intentas acceder a la configuración simplemente no puedes, te quedas en una página de error. ¿Hay solución? , si no ya no me molestaría en escribir esto.

Primero hay que entrar en la configuración del navegador poniendo en la barra de direcciones about:config. Te dará un aviso de que por ahí mejor no tocar que igual se rompe, tú con aplomo y seguridad tira p’alante. En el campo de búsqueda pones security.tls.version.min, cuando lo encuentre haces doble click sobre él y cambias el valor que tiene por un 0. Tras esto cierras firefox y lo vuelves a abrir. Ahora ya debería permitirte acceder al router (o a la web a la que querías acceder, pero en caso de un sitio web externo ten en cuenta la seguridad de la transmisión no está garantizada)

Usar GoogleDrive como CDN

A la hora de mejorar la velocidad de carga de nuestra web es interesante usar un CDN para liberar de trabajo a nuestro servidor. Si bien es cierto que lo mejor sería pagar por uno a veces no nos compensa para el proyecto que realizamos. Y nos encontramos con otra opción: Usar una cuenta gratuita de GoogleDrive como CDN. ¿Es esto posible? Sí.

El primer paso, obviamente, es tener una cuenta de Google. Gracias a eso tendremos 15 GB de almacenamiento en GoogleDrive.Crea entonces dentro de tu cuenta una carpeta y llámala, por ser original, CDN.

Haz click derecho sobre la nueva carpeta y eliges la opción compartir. Una vez dentro de la ventana «Compartir» haces click en «Avanzada».

Compartiendo una carpeta en google drive
Esta imagen está siendo cargada desde una cuenta de drive

Por defecto la carpeta estará configurada para que sólo la veas tú, así que le das a cambiar y eliges la opción «Sí: Público en la web». Luego sólo te queda metar imágenes en esa carpeta.

otra imagen desde Drive como CDN

Ahora lo interesante es ver cómo usar esa imágenes en una web.

Si te vas a la foto y eliges «Compartir» te sacará un churro tal cual este

https://drive.google.com/file/d/0B-GFTravIZzzZWpkUnVwMkRLdUE/view?usp=sharing

La parte interesante viene con el id de la imagen, que sería 0B-GFTravIZzzZWpkUnVwMkRLdUE (es decir, lo que va entre el /d/ y el /view?usp=sharing. Para poder usar la imagen en vuestra web debéis utilizar esta estructura

https://drive.google.com/uc?export=download&id=

y pegarle detrás el id de la imagen, tal que así:

https://drive.google.com/uc?export=download&id=0B-GFTravIZzzZWpkUnVwMkRLdUE

La desventaja de este método está a nivel de posicionamiento, ya que cuando los buscadores encuentren la imagen no remitirá a tu sitio sino a Google Drive, aunque por otra parte te libras del riesgo de hotlinking. En todo caso, esto de proporciona una solución por si tiene un hosting gratuito con espacio muy limitado, o simplemente para mejorar la velocidad de carga de tus imágenes.

Javascript: Devolver 0 cuando parseInt() o parseFloat() reciban una cadena vacía

Tip rápido sobre Javascript: Imaginad que recogemos los datos de un formulario para que calcule en pantalla un sumatorio conforme el usuario los va introduciendo. Ahora imaginad que el usuario se deja un campo vacío. Cuando la función javascript se encuentre una cadena vacía, e intente convertirla a un número (con parseInt() o parseFloat() según lo que necesitemos) el resultado de la suma será NaN. ¿Cómo lo evitamos? Pues con un OR.

Si utilizamos el operador || seguido de un cero, tal como está en el ejemplo que verás a continuación, este evaluará de forma lógica la expresión, y en caso de que el primer término evaluado sea falso devolverá el segundo, un cero (el resultado NaN que devolverá la función que parse a número será evaluado como falso):

var s = '';
var total = 1;

//Si hago esto, el resultado es NaN
total = total + parseInt(s);

//Si hago esto, el resultado es 1
total = total + (parseInt(s) || 0;);

//con parseFloat funciona igual

Otra opción, utilizar el operador ternario ?:, como pusimos en otro ejemplo pasado.

El operador ternario ?: en Java

Seguramente hayas visto en algún ejemplo de código usar el símbolo de interrogación como un operador. Y te preguntarás ¿esto cómo va?. La idea es que más o menos funciona como un condicional if/else devolviendo un valor según una condición se cumpla o no. La sintaxis sería expresiónAEvaluar?valorADevolverSiCierto:valorADevolverSiFalso;

Y como ejemplo práctico, el siguiente código:

/*
Comprobamos si x es mayor que y. 
En caso afirmativo nuestra variable vale x,
y en caso negativo y.
*/
variable=(x>y)?x:y;
/*la alternativa al operador ternario, usando if/else sería*/
if(x>y){
  variable = x;
}else{
  variable = y;
}

Dicho operador existe, con algunas variantes en su sintaxis, también en PHP, C, C++, Python, Perl y aunque en VB.NET no existe sí disponéis de la función IIF cuyo funcionamiento es similar. Como puedes ver te permitirá ahorrar líneas de código y tener un código más elegante.

Java/JSP: al enviar formulario por método POST los caracteres UTF-8 no aparecen bien representados

Me encontraba esta mañana trabajando sobre un proyecto desarrollado en Java haciendo uso de páginas JSP para las vistas, y me encontré con que al enviar un formulario no se insertaban bien en la base de datos los caracteres acentuados y las ñ, apareciendo otros extraños en su lugar. No era la primera vez que veía esto, era evidente que había un problema de codificación.

Lo primero fue comprobar que todas las páginas tuvieran definida en su cabecera la codificación adecuada:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

Tras ver que eso estaba correctísimo, se me ocurre aplicar al principio del código, antes de recoger los resultados, la siguiente función:

request.setCharacterEncoding("UTF-8");

Y parecía que funcionaba, pero no. En principio en la mayoría de los casos eso soluciona el problema, pero a veces el Tomcat es puñetero (en mi caso estaba usando este servidor) y en algunas casuísticas decide que sigue cascando. Así que seguí buceando, y me encontré con que el problema está en que por defecto Tomcat interpreta los datos recibidos por POST como ISO-8859-1. Y había por medio un servlet funcionando como filtro que me escarallaba todo haciendo inútil el consejo anterior. Total, que fui a estudiarme la configuración del Tomcat, a ver si lo arreglaba definitivamente. Y así fue.

Lo primero es ir a la configuración de Tomcat y editar el archivo Server.xml, buscas allí el elemento Connector y en el valor de URIEncoding pones «UTF-8». Tras esto te vas a la carpeta WEB-INF de tu aplicación y allí editas web.xml, pegando este filtro antes que ningún otro:

  <filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Un último punto: ojito a servlets que puedan funcionar como filtros intermedios antes de llegar a vuestra página jsp, a librerías de generación de contenidos o a frameworks varios, que igual tenéis que configurarlos también (cada proyecto es un mundo, pero por ejemplo con Velocity o Freemarker tendríais que configurarlos para UTF-8).

Detectando intrusos en tu red wifi y bloqueándolos con Ubuntu.

Hace un rato comentaba en Facebook un artículo de El País sobre cómo detectar y echar a intrusos de tu red wifi. Aquí ya hablamos en el pasado sobre cómo asegurar una red wifi, y hace ya unos años sobre herramientas de Windows para detectar intrusos. Pero ¿y con Ubuntu/GNU Linux?

Recordaréis que hace unos meses hablamos sobre la forma de ver qué IP’s están libres en una red haciendo uso de nMap. Pues de forma similar, podemos usar esta herramienta para ver qué equipos están en nuestra red. Usaremos nMap para escanear nuestra red local en busca de todas las ip conectadas:

nmap -v -sP 192.168.1.1/24 | grep down -v

Nos dará un resultado tal cual este de la imagen (en mi caso está el portátil, un móvil y el router)

Escaneando ip con nMap
Captura de la consola usando el comando

Bueno, si compruebas que en esa lista de IP hay dispositivos que no deberían estar el primer paso es cambiar la contraseña del router para echarlos, pero antes puedes apuntar las MAC de los dispositivos para bloquearles el acceso a tu red. No es una medida definitiva, ya que les bastaría con camuflar su MAC para saltar el bloqueo, pero les dará la lata (otra solución, más efectiva aunque tampoco definitiva es usar una lista blanca, es decir, bloquear todas las MAC menos las de tus dispositivos). ¿Cómo conocemos las MAC de los equipos conectados? Pues ya que sabes su IP basta con un comando arp para que veamos la MAC:

#usamos arp -n seguido de la IP
#Para conocer la MAC de ese dispositivo
#en el ejemplo el 192.168.1.103
arp -n 192.168.1.103

De la lista de resultados obtenida, la MAC es el número que aparece como DirecciónHW. Una vez apuntadas las MAC a bloquear (o a permitir), te vas a la configuración de tu router y allí configuras el filtrado por MAC.

Y con esto tienes a los intrusos fuera, al menos por un rato.

jqPlot: mostrar la leyenda en varias columnas

El otro día trabajaba con la librería jqPlot, una librería para crear gráficas por medio de javascript y jQuery, y me encontraba con que la leyenda de un gráfico de tarta que estaba haciendo se salía de su elemento contenedor, dado que tenía muchas líneas (en concreto, 58). Me pregunté ¿Cómo hago para que se muestre en dos columnas?. Pensé que era obvio que a alguien le habría pasado ants y encontré la solución en stack-overflow:

//La localización no es importante, sólo el 
//rendererOptions
legend: { 
  show: true, 
  location: 'ne',
  rendererOptions: {numberColumns: 2}
}

Luego decidí bucear un poco más en la documentación y me encontré con un plugin que nos dará mayor versatilidad para trabajar con la leyenda: jqplot.enhancedLegendRenderer.js

La cuestión es invocarlo dentro de la configuración de la leyenda y, además de permitirnos definir el número de filas y columnas (cosa que ya podemos hacer con el renderer normal, pero en este han pulido algunos bugs) también nos permite ocultar/mostrar una serie al pinchar en la leyenda. Se me ocurrió usarlo para mostrar los resultados debajo de la gráfica, en 6 columnas de 10 filas, para que quedara más bonito. Total, que la cosa fue así:

//La localización no es importante, sólo el 
//rendererOptions
legend: {
  renderer: $.jqplot.EnhancedLegendRenderer, 
  show: true, 
  location: 's',
  rendererOptions: {numberColumns: 10, numberRows: 6}
}

Utilizar .htaccess para protegerse de inyecciones SQL

Llevo unos días que no encuentro tiempo para escribir, pero vamos con un tip cortito que puede servir de ayuda para mejorar la seguridad de nuestra web.

La inyección SQL es un peligro para la integridad de nuestros datos y ya más de una vez hemos visto formas de protegernos. Como un plus de seguridad nunca está mal, vamos a ver cómo usar el fichero .htaccess de nuestro servidor para conseguir un plus de protección contra este tipo de ataques. El siguiente cojunto de reglas nos ayudará a mejorar la protección de nuestro sitio:

RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR]
RewriteCond %{QUERY_STRING} \.\./\.\. [OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]

Recordad que hay que tener el servidor configurado para que .htaccess esté activo y permita el filtrado de URL.

SquashFS: Creando archivos de sólo lectura para ahorrar espacio.

SquashFS es un sistema de archivos comprimido de sólo lectura para Linux. Se diseñó para utilizarlo en sistemas de memoria muy limitada, por ejemplo en muchos live-Cd de Linux, en el firmware de un router (y en general para sistemas embebidos), aunque también puede ser utilizado para ahorrar espacio. Veamos cómo:

Imagina que tu empresa tiene carpetas donde almacena los documentos de la última década organizados en carpetas por años. Lo más habitual es que estos archivos no vayan a ser modificados sino simplemente consultados. SquashFS nos permitiría comprimirlos, ahorrándonos espacio e incluso mejorando la velocidad de lectura.

El procedimiento a seguir consta de dos pasos: crear una imagen de disco con SquashFS para comprimir los datos y montarla en el sistema para acceder a ellos. Para lo primero tenemos el comando mksquashfs, cuxa sintaxis sería algo así: mksquashfs [directorios a comprimir] imagenDestino.sqsfs -comp [el algoritmo de compresión a usar] -b [tamaño de bloque ]. Vale, que visto así acojona pero os pongo un ejemplo práctico, donde comprimiremos las carpetas Facturas-2010, Facturas-2011 y Facturas-2012 en una imagen de SquashFS llamada HistoricoFacturas201012, usando el algoritmo de comprsión xz (que es la opción que nos da un mayor ratio de compresión) y con un tamaño de bloque de 1024kb (1 mega). Si no definís tamaño de bloque, por defecto serán 64kb:

mksquashfs facturas-2010 facturas-2011 facturas-2012 historicofacturas201012.sqsfs -comp xz -bs 1M

Con eso habremos creado una imagen de disco de sólo lectura en formato sqsfs, por lo que sólo nos queda montarlo como si fuera un disco para poder acceder a su lectura:

mount historicofacturas201012.sqsfs Facturas_10_12/

Si posteriormente quisiéramos extraer una de estas carpetas, por ejemplo para eliminar algún archivo, nos bastaría con el comando unsquashfs, usado tal que así unsquashfs [opciones] nuestraimagen.sqsfs [Directorios o archivos que extraemos]

Con nuestro ejemplo:

unsquashfs historicofacturas201012.sqsfs facturas-2010

Por defecto usará como directorio de extracción squashfs-root. Esto puede cambiarse usando la opción -d con el comando antes citado.

Cambiando el color de fondo del Centro de Software de Ubuntu para verlo en temas oscuros

Como os comentaba no hace mucho, actualicé de ElementaryOS Luna a ElementaryOS Freya. Posteriormente le metí el tema Numix, que estéticamente ha quedado fetén, pero que tenía un problema muy grande (típico de los temas oscuros GTK, por cierto): el fondo del centro de software es demasiado claro y la letra es blanca, lo que provoca que sea imposible leer el texto.

¿Hay solución? Claro que sí, que para algo esto es software libre y podemos meter mano. Lo bueno del centro de software es que la estética está definida en un archivo CSS, así que podemos editarlo cómodamente.

Lo primero es abrir el archivo /usr/share/software-center/ui/gtk3/css/softwarecenter.css con un editor de texto y con permisos de administrador para poder trastear, por ejemplo con el comando

sudo gedit /usr/share/software-center/ui/gtk3/css/softwarecenter.css

Una vez con el archivo abierto, casi al principio de todo, tienes una línea que pone los siguiente:

@define-color super-light-aubergine #F4F1F3;

Ahí se define el color de fondo del Centro de Software, que es un gris muy clarito, por lo que al estar ahora la fuente en blanco por el tema no se verá. La cosa es ponerle un gris más oscuro, así que la solución es comentar esta línea y cambiarle el color por otro tal que así (le voy a poner un gris oscuro):

@define-color super-light-aubergine #8A8A8A;

Y esto deja un resultado como el de la siguiente foto:
Centro Software Modificado

No es muy estético, pero ahora ya se lee. Podéis elegir otro color si queréis, tened en cuenta que el texto oscila entre blanco y negro, por lo que estos dos no son recomendables, el resto ya a vuestro libre albedrío.