JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo evitar problemas con campos numéricos en JavaScript

Cuando en un formulario Web tenemos un campo de texto (INPUT, type=text), que se utiliza para que los usuarios introduzcan números (por ejemplo su edad, un número de factura...) lo habitual es verificar su contenido con la función parseInt de JavaScript. Imaginemos por ejemplo que hay que verificar que un campo de este tipo no sobre pase un determinado valor. Normalmente escribiríamos una condición similar a esta: if ( parseInt(micampo.value) > valorMax ) alert("Se ha sobrepasado el máximo"); Un código sencillo, directo y, en apariencia, sin problemas. Pero, ¿qué pasaría si por ejemplo el usuario introduce el número '034', es decir, incluye el dígito cero precediendo al número?. Respuesta: que parseInt en lugar de devolver el número 34 que es sin duda el que esperábamos devolverá un 28. El motivo es que la función parseInt interpreta los textos que comienzan con un cero como números en base octal y no decimal, por lo que 034 se interpreta como el número 28 en base octal.... [Más]

Visor Web de ensamblados .NET 2.0

Me ha llamado mucho la atención esta utilísima herramienta basada enWeb que ha escrito Francesco Balena. Se trata de un visor de ensamblados .NET basado en Web, accesible públicamente y que trabaja con .NET 2.0. Te permite navegar por cualquier ensamblado y, utilizando reflexión, visualizar sus clases, miembros, interfaces, etc... pudiendo ahondar en ellos. Marca las novedades y diferencias entre .NET 2.0 y versiones anteriores. Una de las cosas que más interesantes me han parecido es que en cualquier miembro puedes averiguar qué tipos derivan de él, qué miembros devuelven el tipo seleccionado y cuáles lo usan bien como parámetro o como valor de retorno. Se pueden utilizar URLs directas para llegar a determinados tipos, lo cual es muy útil para referenciarlos en textos o mensajes a foros, por ejemplo.

Subclasificación de ventanas en .NET

¿Qué es la subclasificación? El sistema operativo Windows efectúa la comunicación entre los diversos objetos de la interfaz de usuario utilizando mensajes. Todo lo que ocurre en la interfaz requiere mensajes para ocurrir. Por ejemplo, cuando pulsas con el ratón sobre una ventana se envía un mensaje para indicar en dónde has pulsado y cómo. Si haces clic en el aspa de cerrar una ventana Windows envía un mensaje a ésta para que se cierre. Etc, etc... Otra cuestión a tener en cuenta en este contexto es que, en contra de lo que pueda parecer, muchos objetos aparte de las propias ventanas son también ventanas. Por ejemplo, un cuadro de texto, un botón o una rejilla son ventanas (sólo que de otros tipos) y por consiguiente reciben mensajes del sistema operativo para indicarles cómo deben comportarse. Cuando un proceso intercepta y (opcionalmente) modifica los mensajes que se envían a una ventana se dice que la ventana ha sido subclasificada. Pero, ¿para qué puede nos puede valer esto?. E... [Más]

Truco: Almacenamiento externo automático de cadenas de conexión

Cuando colocamos un objeto de conexión a un origen de datos sobre un formulario Windows Forms de Visual Studio .NET, éste aparece en la parte inferior del diseñador correspondiente y podemos editar sus propiedades desde la ventana de propiedades del entorno. La propiedad más importante de este objeto es, sin duda, ConnectionString. Normalmente la ajustamos desde la propia ventana de propiedades, y mucha gente la deja simplemente ahí, sin añadir forma alguna de modificarla de forma externa a la aplicación. Esto tiene varios problemas, pero los principales son: · Si queremos actualizar la cadena deberemos cambiar la propiedad desde el diseñador y recompilar la aplicación· Si alguien rastrea o descompila el código puede leer en claro la cadena (con contraseñas de acceso y otra información confidencial). Para evitar el primero de estos problemas es obvio que lo más sencillo es llevar esta cadena de conexion (entera o por partes) a algún archivo externo de configuración que leeremos de... [Más]

Registro automático de cambios en una tabla desconectada

Como es bien sabido la clase DataSet de .NET (dentro del espacio de nombres System.Data), permite utilizar de manera sencilla y potente un pequeño gestor de datos en memoria, sin necesidad de haber obtenido por fuerza los datos a partir de un gestor de datos convencional. El objeto DataSet puede haber sido creado dinámicamente por nosotros o se puede haber generado para trabajar en memoria con tablas y relaciones obtenidos de una fuente de datos relacional, por ejemplo. Un DataSet contiene, entre otras cosas, una colección de objetos DataTable que, como puede imaginar, son equivalentes conceptualmente a las tablas o relaciones en una base de datos relacional. No voy a entrar aquí a explicar todas las características de este tipo de objetos, pero sí me gustaría recordar que generan dos eventos con el fin de notificar de los cambios que sufren. Estos eventos son RowChanged y RowDeleted, y se lanzan cuando se cambia algún valor  o cuando se elimina una fila de la tabla respectivamente. ... [Más]

Cómo saltarse la protección de los cortafuegos por software

Me ha llamado poderosamente la atención este artículo del reciente número 62 de Phrack Magazine. En él se estudian los fundamentos del funcionamiento de los cortafuegos por software en el sistema operativo Windows. Después se ilustran dos métodos que un virus o programa mailintencionado podría emplear para comunicarse con el exterior de un sistema protegido, anulando el cortafuegos. Aunque no seas un programador de virus seguro que puedes aprender algo nuevo con él (te advierto es algo "espeso").

Cómo generar identificadores (GUID) en .NET

Un GUID es un conjunto de números que constituyen un identificador único (Global Unique IDentifier), es decir, que tiene la particularidad de que es imposible (al menos en teoría) generar otro idéntico aunque usemos el mismo algoritmo. Sus utilidades son muchas pero obviamente todas se refieren a la necesidad de identificar de manera úica alguna entidad, dato u objeto, de forma que lo podamos distinguir de cualquier otro independientemente de cómo, cuándo y dónde haya sido generado. Es especialmente útil en aplicaciones de bases de datos para identificar de manera única registros de diversas tablas (o de una sola si no usamos autonuméricos). Antes de .NET, sobre todo si programabas con Visual Basic, un truco muy socorrido para generar este tipo de GUID era utilizar SQL Server para generarlos, empleando la siguiente consulta: SELECT NEWID() que devuelve expresiones similares a esta: 9035DEC7-A6C2-4B1B-AA99-37401965E7C0 Lo malo es que si no teníamos SQL Server no nos servía el tru... [Más]

Modelado de amenazas: herramientas y referencias

El modelado de amenazas es el proceso de análisis de las aplicaciones, previo a su desarrrollo, que nos permite diseñar nuestras aplicaciones desde el punto de vista de la seguridad. A pesar de su importancia un gran porcentaje de los programadores no tienen en cuenta la seguridad de las aplicaciones cuando programan, y los arquitectos de soluciones tampoco suelen hacer un análisis formal de este aspecto. Se tiende a pensar que la seguridad es un problema de los administradores de sistemas, cuando en realidad una aplicación mal desarrollada puede ser el mayor problema de seguridad existente en una empresa por muy bien protegidos que se encuentren los sistemas y las comunicaciones. El libro Writing Secure Code 2nd Edition (de lectura obligatoria en Microsoft), en su capítulo 4 introduce la importante técnica llamada "Modelado de amenazas" que persigue minimizar los riesgos inherentes a la falta de seguridad atajándola desde el propio diseño de las aplicaciones. Ahora acaba de aparece... [Más]

Snippet Compiler: se acabó abrir Visual Studio para cualquier tontería

Este programita me lo recomendó el otro día un amigo y la verdad es que me pareció estupendo. Situación típica de programador: te surge una duda de programación y quieres hacer una pruebecilla tonta de código para comprobar cómo funciona algo, probar una función o una clase .NET. ¿Qué haces?: o eres de esos "machotes" que programa directamente en la línea de comandos y usa los compiladores con todas las opciones, o si eres un vago como yo abres Visual Studio .NET, creas un proyecto del tipo adecuado y pruebas el código con toda la comodidad del entorno: depuración, ayuda contextual, etc.. ¿verdad? El problema es que haciéndolo así creas un montón de proyectos tontos que no valen para nada después de usarlos, que se quedan en el disco duro, crean directorios virtuales en IIS (en el caso de aplicaciones ASP.NET) y aparecen después en la página principal cada vez que abres el entorno. A lo mejor piensas que soy un maniático, pero a mi me molesta un montón. La solución: Snippet Compil... [Más]

Cómo conectarse a un archivo de texto CSV con ADO/OLEDB

Últimamente me encontré con este problema en una integración y, aunque parece un tontería, lo cierto es que tiene más miga de la que parece... Tras haber investigado un poco y a base de prueba y error llegué a las siguientes conclusiones que considero bastante interesantes. Para conectarse a un archivo de texto CSV desde ADO/OLEDB como si se tratase de una base de datos se debe utilizar una cadena de conexión especial. Si se trata de un archivo CSV con encabezados, es decir, que lleva en su primera fila los nombres de los campos la cadena de conexión a utilizar es la siguiente: "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=Ruta_a_la_carpeta_contenedora_del archivo;Extensions=asc,csv,tab,txt;HDR=NO;Persist Security Info=False" Si, por el contrario, el archivo de texto no tiene cabeceras con nombres de columnas la cadena de conexión adecuada es la siguiente: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Ruta_a_la_carpeta_contenedora_del archivo;Extended Properties='text;HDR... [Más]