Se acabó la temporada

Como ya comenté hace un par de años hoy, 31 de agosto, es el día en el que se acaba una temporada y comienza otra, por lo que celebro el “fin de año” esta noche.

A diferencia de otros años, que han sido más tranquilos, sólo cenas, este año creo que toca algo distinto, y es que coincide con la despedida de soltero de uno de mis socios, así que supongo que el desfase será bastante mayor. Además, mañana tengo visita con el notario para cerrar las negociaciones de otro proyecto. Sin duda va a ser un cambio de año muy distinto a los anteriores.

Por ahora los planes más inmediatos son los de un mes de septiembre bastante movidito (dos bodas, unas charlas, varios viajes a Granada…) aunque a partir de octubre voy a calmarlo bastante. A parte de preparar mi visita a Miami de finales de 2010, creo que poco más voy a hacer. Me he propuesto dejar de lado la parte más pública (ir a eventos, dar charlas y demás) para centrarme más en hacer experimentos, dedicar mucho más tiempo a los clientes de SEO y cambiar algunos detalles de mi relación con proyectos en los que estoy, lo que significa mayor implicación en unos y menor en otros.

Sin duda la temporada 2009/2010 ha sido una de las más interesantes en mi vida profesional, y estoy convencido de que esta temporada 2010/2011 va a ser, a parte de lo profesional, muy interesante en cuanto a lo personal.

Evita, con PHP, ataques XSS y SQL injection

Una de las cosas que normalmente no revisamos cuando creamos un sitio web es la vulnerabilidad que se tiene a ataques por URL por cosas como XSS e incluso a ataques a la base de datos por una mala configuración. Para esto normalmente se usa una revisión y se ejecuta, con PHP, la función htmlentities() que, gracias a eliminar el código HTML puede filtrar cosas como los <script>. Para solventar esto existe una cosa llamada Genius Open Source Libraries que, con unas simples funciones, permiten hacer una megalimpieza contra ataques de todo tipo.


require_once 'Core/sgConfig.inc.php';
// Output an unsafe string, presumably user input
$xss = '<script>alert(\'oh snap\');</script>';
echo 'If your entered your name as ' . $xss . ', we\'d be in trouble.<br>' . "\n";
// Sanitize that string, and output it safely
$htmlContentContext = sgSanitizer::sanitizeForHTMLContent($xss);
echo "But if we sanitize your name, " . $htmlContentContext . ", then all is well.<br>\n";
echo '<h2>HTML Attribute</h2>';
// We can also safely sanitize it for an HTML attribute context
$htmlAttributeContext = sgSanitizer::sanitizeForHTMLAttribute($xss);
echo 'Tainted strings can also be used in an <a href="http://google.com" title="' . $htmlAttributeContext . '">HTML attribute</a> context.<br>' . "\n";
echo '<h2>JavaScript string</h2>';
// And we can even make strings used in JavaScript safe
$jsString = '\';alert(1);var b =\'';
echo '<script type="text/javascript">
var a = \'' . $jsString . '\';
var aSafe = \'' . sgSanitizer::sanitizeForJS($jsString) . '\';
</script>';

En este sistema de limpieza descargable como proyecto Genius encontramos algunas funciones como sanitizeForHTMLContent (que limpia el contenido teniendo en cuenta que es código HTML), sanitizeForHTMLAttribute (que limpia como atributo de HTML, por ejemplo el “alt” de una imagen) o sanitizeForJS (que dejaría el código arreglado para poder ejecutarse como JavaScript).

Sin duda una biblioteca de funciones interesante a la hora de aumentar la seguridad de un sitio web.

Cada vez buscamos de forma más concreta

Cada día que pasa hay más usuarios en la red de redes, y según pasa el tiempo los usuarios aprenden de forma significativa cómo se ha de buscar. Lo de utilizar una única palabra genérica ya ha pasado de moda (sobre todo en plataformas que han madurado) y, por eso, me he decidido a escribir un poco sobre ello.

Y es que existen varios tipos de búsqueda: informacionales, navegacionales, transaccionales, comerciales o geolocalizadas. Quizá las más frecuentas e interesantes en el caso que nos toca son las primeras.

  • Informacional: Son aquellas en las que el usuario quiere aprender algo (sobre el 50% de las consultas). P.E.: [viajes de Cristobal Colón]
  • Navegacional: Son aquellas en las que queremos ir a un sitio (sobre el 20% de las consultas). P.E.: [el país]
  • Transaccional: Son aquellas en las que queremos hacer/conseguir algo (sobre el 30% de las consultas). P.E.: [imágenes Barack Obama]

Aproximadamente, en 2004 las consultas que se realizaban eran de unos valores que rozaban los siguientes:

1 palabra
2004 – 19.02%
2009 – 20.29%
2 palabras
2004 – 32.58%
2009 – 23.65%
3 palabras
2004 – 25.61%
2009 – 21.92%
4 palabras
2004 – 12.83%
2009 – 14.89%
5 palabras
2004 – 5.64%
2009 – 8.68%
6 palabras
2004 – 2.32%
2009 – 4.65%
7 palabras
2004 – 0.98%
2009 – 2.49%
8 palabras
2004 – 0.01%
2009 – 3.43%

Esto nos dejaría con algo tal que así:

Analizando los datos de los dos últimos años, en los que a parte de los grandes buscadores aparece Facebook, vemos como la tendencia es que cada vez más, según las plataformas maduran, las consultas que se realizan sobre ellas también crecen:

Lo curioso es que aunque Facebook tan sólo recibe 650 millones de consultas en su buscador frente a las 10.000 millones que recibe Google, es una cantidad razonable; eso sí, hay que tener también presente que Facebook es hoy en día el sitio de Internet más visitado del mundo y que, aunque Google está pensado para realizar búsquedas y Facebook no, si se lo planteasen podrían comerle un buen trocito de mercado al gigante de Mountain View.

En fin, hace unos días mi socio Jaime Ferré comentaba que habían desaparecido todos aquellos “webmasters” que se dedicaban a los intercambios de enlaces y a conseguir posicionarse en el TOP 3 de Google por palabras genéricas del TOP de Alexa y es que, como a muchos nos ha pasado después de muchos años en la red, los usuarios parece que ya saben qué han de visitar y usan los buscadores para consultar cosas mucho más concretas.

Reproductor HTML 5 para vídeo

Estamos muy mal acostumbrados a que nuestros vídeos se alojen en FLV en sitios como Youtube o Vimeo. Hoy en día teniendo en cuenta que el ancho de banda está tirado de precio, no entiendo porqué no se tiende a la calidad y a alojar la propia información si que otros decidan.

Con HTML 5 y su nuevo elemento <video> tenemos la posibilidad de incluir muchos formatos de vídeo con muchas opciones… y para hacerlo ya todo más sencillo, además de hacerlo compatible con versiones anteriores que no soportan los nuevos formatos, están apareciendo algunos sistemas que permiten estos reproductores de una forma “chula” y fácil.

Algunos de los que he encontrado son estos:

  • FlareVideo: Necesita de jQuery y el soporte es, a mi gusto, un poco reducido… hay que programar expresamente para ello.
  • MediaElementsJS: También necesita de jQuery, soporta todos los navegadores e incluso terminales móviles. Hay que incluir el nuevo tag <video> y unas pocas líneas más… Esto significa que cuando todos los navegadores den soporte, se quita y todo seguirá funcionando.
  • JW Player: La nueva versión de este tan utilizado reproductor ya es compatible con HTML 5. Necesita de jQuery y aun está en βeta.
  • VideoJS: No necesita de librerías externas y funciona gracias al elemento <video>, lo que, en principio, a mi me da mucha seguridad. Funciona con todos los navegadores y soporta los nuevos formatos.
  • SublimeVideo: Aunque aun no ha salido oficialmente, lo que se puede ver es parecido al VideoJS, es decir, que no necesita de librerías externas y funciona gracias al elemento <video>. En principio funciona con todos los navegadores, soporta la mayoría de formatos.