sábado, 29 de diciembre de 2007

Primeros pasos con jQuery

jQuery es una librería de JavaScript, su principal utilidad es dar un acceso más claro y sencillo a los elementos de la web mediante la filosofía DOM.

La librería es muy sencilla de instalar, tan solo hay que ir a la web de jQuery, descargar la última versión, subirla al servidor web e incluirla en donde queráis usarla de la siguiente forma (como cualquier fichero javascript):

<script type="text/javascript" src="jquery.js"></script>

Casi todos los códigos que usen jQuery comenzarán así:

$(document).ready(inicializar);

¿Qué significa esa línea de código? "Cuando se descargue la página web por completo llama a la función 'inicializar'".

Esa función 'inicializar' será la que asignará cada evento a cada elemento del DOM de la página.
Para los ejemplos voy a utilizar una web con 6 botones y una caja de texto:

<html>
<title>Titulillo</title>
<h1>Prueba</h1>

<body>

<input type="button" id="boton1" value="click">
<input type="button" id="boton2" value="click">
<input type="button" id="boton3" value="click">
<input type="button" id="boton4" value="click">
<input type="button" id="boton5" value="click">
<input type="button" id="boton6" value="click">
<input type="text" id="text1" value="click">

</body></html>

La función 'inicializar' sería algo como lo que sigue:

function inicializar(){
$("input").click(BotonClick);
$("input").hover(
function() { $(this).addClass("blanco"); $(this).removeClass("rojo");},
function() { $(this).addClass("rojo"); $(this).removeClass("blanco"); }
);
}

Esta función asocia a todos los elementos "input" de la página el evento "click" con la función 'BotonClick', así que cada vez que hagamos click en un botón de la página o en la caja de texto se ejecutará esa función.

La segunda hace lo mismo con el evento "hover", pero en esta ocasión se le asocian dos funciones, la primera se ejecutará cuando el ratón pase por encima de un elemento "input" y la segunda cuando salga de su espacio.

Otra diferencia es que las funciones asociadas son anónimas (no se pueden llamar desde otro sitio).

¿Qué hacen esas funciones? El código de las dos es muy parecido, añaden al objeto la clase rojo y eliminan la clase blanca y viceversa.

¿Para qué? Asociando los objetos de la página mediante clases se pueden manipular de forma más sencilla, por ejemplo, en el caso anterior si la página tuviera el siguiente código css:

<style>

.blanco{
background-color:#ffffff;
}

.rojo{
background-color:#ff0000;
}

</style>

Los elementos "input" de la página cambiarían de rojo a blanco y de blanco a rojo al pasar por encima de ellos con el ratón.

Hay muchas posibilidades, otro ejemplo de lo que se puede hacer:

function BotonClick(){
$(this).hide();
}

El elemento en el que se haga click desaparecerá, gracias a cosas como esta se puede reconstruir la interfaz de una página dinámicamente.

viernes, 21 de diciembre de 2007

Enviar formularios con javascript

Normalmente, el código html para enviar un formulario es algo parecido al siguiente:
Introduzca su nombre:
<form action="index.php" method="get">
<input name="nombre" type="text">
<input value="Enviar" type="submit">
</form>

Pero puede darse el caso, de que en nuestra página nos interese enviar el formulario al hacer click en un enlace, eso se puede solucionar mediante javascript de la siguiente forma:

Introduzca su nombre:
<form action="index.php" name="formulario" method="GET">
<input type="text" name="nombre">
<a href=javascript:document["formulario"].submit();>Enviar</a>
</form>

Aunque funciona correctamente no queda demasiado bien que el usuario vea el código javascript al pasar por encima del enlace, se puede ocultar cambiandolo por lo siguiente:

Introduzca su nombre:
<form action="index.php" name="formulario" method="GET">
<input type="text" name="nombre">
<a href=# onclick=javascript:document["formulario"].submit();>Enviar</a>
</form>

Bueno, aunque todos los enlaces los he colocado entre las etiquetas form del formulario, pueden estar en cualquier otro sitio, por ejemplo:

Introduzca su nombre:
<form action="index.php" name="formulario" method="GET">
<input type="text" name="nombre">
</form>

<a href=# onclick=javascript:document["formulario"].submit();>Enviar</a>

Igualmente, he usado enlaces para colocar el código javascript, pero es indiferente, se puede colocar el código en cualquier elemento que soporte javascript.

jueves, 6 de diciembre de 2007

¿Como hashear contraseñas en perl?

Casi todas las aplicaciones web que hay en internet requieren registro, este registro consiste normalmente un nombre de usuario y una contraseña.

Para que la aplicación web nos pueda identificar la próxima vez que introduzcamos el usuario y contraseña es necesario que almacene estos datos de alguna forma (normalmente una base de datos).

El problema de este enfoque es que si se descubre una vulnerabilidad en la aplicación web que permita listar campos de la base de datos (por ejemplo, inyección SQL) el atacante podrá leer todos los nombres de usuario y contraseñas del sitio web.

Para solucionarlo en parte, una medida común es no guardar las contraseñas como tales en la base de datos, sino un dato derivado de la contraseña, por ejemplo, se puede pasar la contraseña a una función hash y guardar el resultado obtenido.

Para el proceso de autentificación, ahora no habrá que comparar la entrada del usuario con el valor que hay en la base de datos, sino el hash de la entrada del usuario con el valor de la base de datos, si estos resultados coinciden, la autentificación será correcta.

Eligiento como función hash MD5 y como lenguaje perl, el proceso para crear el hash de una cadena es muy sencillo.

#!/usr/bin/perl

use Digest::MD5 qw(md5 md5_hex md5_base64);

$hash1=md5("pass");
$hash2=md5_hex("pass");
$hash3=md5_base64("pass");

print $hash1 . "\n";
print $hash2 . "\n";
print $hash3 . "\n";

Como se puede ver, he usado tres formas distintas para la misma función hash, la primera (md5) da el resultado en binario, la segunda (md5_hex) en hexadecimal y la tercera (md5_base64) en base 64. Se puede elegir cualquiera de ellas.