Contenido

Añade un Captcha maquero a tus aplicaciones web

20 May

+ 19

Actualmente los captchas son un problema para los usuarios de Internet y aunque cada vez es más normal ver este sistema como control de SPAM de nuestras aplicaciones, cada vez hay más problemas con ellos. Quizas la solución a nuestros problemas la haya traido Apple a nuestras puertas con el iPhone y su sistema de unlock.

slidecaptcha

Alex Boone ha desarrollado Slider, una versión de este sistema en Javascript usando jQuery. La verdad es que está muy conseguido y el resultado es bastante sorprendente, solo nos falta adaptarlos a nuestras aplicaciones web.

Como una aproximación, he montado un pequeño script que nos convertirá todos los elementos <input class=»slider» /> de nuestra aplicación en un Slide. Algo que nos permitirá mejorar la usabilidad de nuestro captcha.

¿Que necesito?

Implementación

Para hacerlo más o menos bien, tendremos que utilizar 3 lenguajes de programación.

1) PHP

En PHP generaremos el secureKey y lo alojaremos en sessión para ser comprobado posteriormente.

<?php
session_start();

function randomText($length) {
    $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
    for($i=0;$i<$length;$i++) {
      $key .= $pattern{rand(0,35)};
    }
    return $key;
}

$_SESSION["secureKey"] = randomText(6);
?>

2) Javascript

Ahora ya tenemos la secureKey en sessión, hemos de relacionarla con nuestro captcha, para ello usaremos un poco de javascript.

//Javascript
$(document).ready(function(){
	var secureKey = '<?=$_SESSION["secureKey"]?>';
	$('input.slider').each(function(x,el){
		// Recipiente
		$(el).before('<div id="slider_'+$(el).attr("id")+'"></div>');

		//Slider
		new Slider('slider_'+$(el).attr("id"),{
			message: $(el).val(),
			color: "green",
			handler: function(){
				$(el).val(secureKey);
			}
		}).init();

		//Ocultamos el input
		$(el).css("display", "none");
	});
});

Como podemos ver, montamos la secureKey de Javascript a partir de los datos almacenados en $_SESSION, así mostraremos el valor que se ha de contrastar en siguientes pasos.

3) HTML

Para que el Javascript detecte el input que deseamos convertir en Slider, tendremos que declarar el elemento de una forma concreta.

//HTML
<input name="slide_captcha" type="text" class="slider" value="BOT" title="Deslizame para activar" />

Recepción de datos

Al igual que cualquier otro elemento de un formulario, el Slide será tratado en el servidor de la misma forma, salvo que este será comprobado con el valor almacenado previamente en sessión.

<?php
session_start();
if ($_SESSION["secureKey"] != $_POST["slide_captcha"]) {
	die("Eres un bot");
} else {
	die("NO eres un bot");
}
?>

Aclaración

He cambiado el post, por que el anterior era erroneo y no funcionaba, oldlastman tenía razón y me he visto obligado a reescribirlo. Siento las molestias.

Actualización

Visto la repercusión que está teniendo este sistema de «captcha», tanto por mail como comentarios, he decidido crear un pequeño plugin para sustituir el botón de submit de nuestros formularios de comentarios. El sistema en sí, es muy simple incluso me planteé 2 veces si hacer un plugin o simplemente explicar como añadir el código, pero por comodidad para todos vosotros, aqui lo teneis 😀

SlideSubmit

Este sistema no es apto para sustituir a los captchas actuales (por desgracia), ya que este sistema expone al usuario la secureKey a los bots encargados de llenarme de SPAM. Habrá que buscar alguna otra forma si queremos deshacernos del sistema actual.

Disponible la RC1 de Firefox 3

18 May

+ 0

Cada vez está más cerca la versión final de Firefox 3, y cada vez son más los fallos que se corrigen acercando a Firefox a un versión estable y lista para que todos los internautas disfruten de las maravillas que Firefox 3 nos ofrecerá. [Descargar]

Siento la paliza que os he dado en estos 3.000 posts

18 May

+ 40

anieto2k3000

Simplemente gracias por seguir ahí y por aguantar la paliza que os doy cada día. 😀

Añade un teclado virtual a tus aplicaciones web

18 May

+ 8

Una forma de darle a tu aplicación web un valor añadido mejorando la usabilidad del sitio es usando un teclado virtual para complementar los elementos <input />.

virtualkeyboard

Esta versión desarrollada en Javascript, nos permite, entre otras cosas, seleccionar la configuración de teclas que deseamos mostrar en un buen listado de posibles.

Instalación

El script se basa de 2 ficheros, un JS en el que se encuentra la funcionalidad necesaria para que el teclado virtual funcione y un fichero CSS en el que podremos personalizar nuestro teclado a nuestro antojo. Simplemente tendremos que llamarlo en el <head></head> de nuestra aplicación.

<script type="text/javascript" src="keyboard.js" charset="UTF-8"></script>
<link rel="stylesheet" type="text/css" href="keyboard.css">

Modo de empleo

Una vez añadidos los ficheros necesarios, únicamente tendremos que añadir a los <input /> que deseemos extender la clase keyboardInput.

<input type="text" value="" class="keyboardInput">

Descargar

Todo el código se encuentra bajo la licencia BSD y se puede descargar desde aqui.

Reloj de la web -2.0 en la web 2.0

18 May

+ 3

Impresionante reloj desarrollado en SVG. Sin duda una fusión perfecta entre lo antiguo y lo moderno.

WordPress 2.6 incluirá Google Gears para trabajar offline

16 May

+ 27

Alex me avisa de un nuevo Changeset (el 7938) en el que podemos ver como la próxima versión de WordPress, la 2.6, integrará la posibilidad de trabajar offline con los contenidos de tu blog.

wordpress-google-gears-init

Una vez actualizado a la última versión, te encuentras la pantalla anterior informandote de que disponemos de esta funcionalidad y que si la activamos Google Gears empezará a almacenar las CSS, contenidos y ficheros necesarios para trabajar offline, que podemos llegar a notar el aumento de tiempo en la carga de la página. La primera vez si que tarde, despues no es tan exagerado.

wordpress-google-gears-info

Si no queremos instalar esta funcionalidad, WordPress no deja un enlace en la parte destinada a la información del Blog en el cual podremos instalar Google Gears. Por si queremos dejarlo para más adelante.

wordpress-google-gears-activate

Si hemos aceptado la instalación de Gears, al entrar en nuestro Panel Administrador nos encontraremos con una ventana de Google Gears que nos solicitará permiso para empezar a registrar datos, si aceptamos no nos volverá a solicitar esta activación.

wordpress-google-gears-saving

Al entrar en por primera vez en nuestro Panel de Administrador despues de haber instalado Google Gears automáticamente comenzará a almacenar en local los ficheros y contenidos para usarlos offline. Una vez terminado podremos continuar con nuestra tarea diaría.

Esta opción es ideal para gente que como a mi, los fines de semana me voy a la casa de campo y no puedo actualizar con artículos pendientes que me gustaría ir editando. Así, podré llevar en el portatil almacenado todo el contenido del blog, para intentar actualizarlo con mayor frecuencia. Nos vendrá de perlas hasta que los navegadores integren Almacenamiento DOM y se haya de migrar todo esto 😀

Opera publica el File I/O API para Widgets

16 May

+ 1

Opera se sube al carro de los widgets con la especificación de File I/O propuesta por la W3C. Con ella se pretende conseguir una abstracción en forma de sistema de ficheros donde alojar ficheros con permisos de lectura y escritura dentro de nuestro navegador.

Esto nos permitirá crear Widgets para este navegador en el cual podamos almacenar ficheros de los que podremos obtener y guardar datos que ayudarán a potenciar la aplicación.

Para aprovecharnos de esta especificación Opera nos brinda 3 objetos que contienen todas las funcionalidades posibles sobre la API. FileSystem, File y FileStream.

FIleSystem

Inicializado como un singleton, nos proporciona un sistema de ficheros virtual con el que trabajar.

opera.io.filesystem = function () {
    mountPoints =  {};
    mountSystemDirectory = function ( location, name ) { ; }
    removeMountPoint = function ( mountpoint ) { ; }
    browseForDirectory = function ( name, defaultlocation, callback, persistent ) { ; }
    browseForFile = function ( name, defaultlocation, callback, persistent, multiple, filter ) { ; }
    browseForSave = function ( name, defaultlocation, callback, persistent ) { ; }
}

File

Al igual que otros frameworks, con File podemos apuntar a un directorio, archivo o ficheros regulares. Una vez cargado nos proporcionará una gran cantidad de propiedades y métodos para trabar con el fichero.

var File = function () {
    parent = {};
    readOnly =  false;
    exists =  false;
    isFile =  false;
    isDirectory =  false;
    isArchive =  false;
    metaData = null;
    created =  {};
    modified =  {};
    name =  '';
    path =  '';
    nativePath =  '';
    maxPathLength =  0;
    fileSize =  0;
    length =  0;
    open = function ( path, mode ) { ; }
    copyTo = function ( path, overwrite, callback ) { ; }
    moveTo = function ( path, overwrite, callback ) { ; }
    createDirectory = function ( directory ) { ; }
    deleteDirectory = function ( directory, recursive ) { ; }
    deleteFile = function ( file ) { ; }
    refresh = function () { ; }
    resolve = function ( path ) { ; }
    toString = function () { ; }
}

FileStream

Será usado cuando se quiera leer o escribir sobre un fichero, soporta lectura y escritura de text, imagenes, datos binários y texto en Base64.

var FileStream = function () {
    position = 0;
    bytesAvailable = 0;
    eof = false;
    encoding =  '';
    close = function (  ) { ; }
    read = function ( length, charset ) { ; }
    readLine = function ( charset ) { ; }
    readBytes = function ( length ) { ; }
    readBase64 = function ( length ) { ; }
    write = function ( string, charset ) { ; }
    writeLine = function ( string, charset ) { ; }
    writeBytes = function ( bytes, length ) { ; }
    writeBase64 = function ( string ) { ; }
    writeFile = function ( file ) { ; }
    writeImage = function ( image ) { ; }
}

Podemos probarlo con la última release de la versión 9.5

Google DocType, documentación para desarrolladores web

15 May

+ 11

La propia página de Google Doctype, lo resume en una sola línea.

Google Doctype is an open encyclopedia and reference library. Written by web developers, for web developers.[…]

Osea

Google Doctype es una enciclopedia abierta y una librería de referencia. Escrita por desarrolladores web, para desarrolladores web.[…]

Con esa línea nos deja entrever lo que nos vamos a encontrar en su interior:

  • Artículos sobre seguridad
  • Artículos sobre Javascript
  • Artículo sobre CSS

Todo ello 100% libre bajo la licencia Creative Commons 3.0 Attribution, osea que podremos usarlos simplemente linkando la fuente de donde los hemos sacado.

Si echamos un vistazo algo más exhaustivo, nos encontramos una pantalla en la que navegar por los artículos además de fácilmente asombra la rapideza con la que aparecen los artículos. Desde HOWTO’s en los que nos muestran código de como hacer algunas de las tareas comunes de cada día (Reconocer el navegador, Verificar la definición de una variable, …) y tareas no tan comunes (Detectar el TextResize, Calcular el espacio de scroll, …)

Otra sección interesante es la recopilación de referencias a los diferentes elementos de los diferentes lenguajes usados en la capa cliente externa del desarrollo web (HTML, CSS, Javascript(DOM)), allí se reunen la documentación necesaria para que no tengas que rebuscar por toda internet.

Personalmente solo puedo decir que ya tengo otro acceso directo formando parte de la barra de marcadores de Firefox 😀

Aprende a hacer tabs con CSS y jQuery como si estuvieras en primero

15 May

+ 3

Si estás planteandote hacer un menú basado en Tabs, este manual podrá ayudaros a conseguir uno realmente elegante mediante el uso de CSS y el todopoderoso jQuery. [Demo]

Detectar plugins instalados en Internet Explorer

15 May

+ 5

Si estás usando window.ActiveXObject() para aportar alguna funcionalidad extra a tus aplicaciones deberías revisar que dicha funcionalidad está disponible, ya sea por que se trata de un navegador diferente o por que el usuario no lo tenga instalado.

Para ello podemos usar el objeto plugins, basado en la recopilación de detectores de plugins para Internet Explorer.

var plugins = {
	hasAcrobat:function() {
		if (!window.ActiveXObject) return false;
		try { if (new ActiveXObject('AcroPDF.PDF')) return true;} 
		catch (e) {}
		try { if (new ActiveXObject('PDF.PdfCtrl')) return true;} 
		catch (e) {}
		return false;
	},
	hasFlash: function() {
		if (!window.ActiveXObject) return false;
		try {if (new ActiveXObject('ShockwaveFlash.ShockwaveFlash')) return true;} 
	    	catch (e) { return false;}
	},
	hasJava: function() {
		return (!navigator.javaEnabled());
	},
	hasQuickTime: function() {
		if (!window.ActiveXObject) return false;
		try { if (new ActiveXObject('QuickTime.QuickTime')) return true;} 
		catch (e) {}
		try {if(new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck')) return true;} 
		catch (e) {};
		return false;        
	},			
	hasRealPlayer: function() {
		if (!window.ActiveXObject) return false;
	    	var definedControls = [
			'rmocx.RealPlayer G2 Control',
			'rmocx.RealPlayer G2 Control.1',
			'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)',
			'RealVideo.RealVideo(tm) ActiveX Control (32-bit)',
			'RealPlayer'
		];
		for (var i = 0; i < definedControls.length; i++) {
			try {if(new ActiveXObject(definedControls[i])) return true;}
			catch (e) {continue;}
		}
		return false;  
	},			
	hasShockwave: function() {
		if (!window.ActiveXObject) return false;
	    	try {if(new ActiveXObject('SWCtl.SWCtl')) return true;} 
		catch (e) {return false;}
	},
	hasWMP: function() {
		if (!window.ActiveXObject) return false;
	  	try {if(new ActiveXObject('WMPlayer.OCX')) return true;} 
		catch (e) { return false;}
	}
}

Modo de empleo

if (plugins.hasFlash()) {
   .... tiene flash ...
} else {
   .... no tiene flash ...
}

Demo

He montado una mini demo para verlo funcionar. Podeis verla aqui.