lunes, 30 de abril de 2012

Hello World en Windows Phone 7

Este podría ser el típico post de tres líneas donde explico de una manera rápida y sencilla como hacer el clásico Hello World! u ¡Hola mundo! en Windows Phone 7. Pero (siempre hay un pero) cuando las cosas no quieren salir no salen y lo que empezó siendo algo de 5 minutos terminó siendo una pequeña batalla de un par de horas.

Comencemos. Lo primero que hice fue buscar el SDK para descargarlo. Esta búsqueda me llevo a está página en donde te puedes descargar el instalador web para el SDK. Como no me gustan los instaladores web, busqué el enlace a la ISO (está en la parte final de la página) y me lo descargué.

Aquí cometí mi primer error. Tras descargarme e instalar el SDK, al arrancar el Visual Studio 2010 Professional no veía por ningún lado las plantillas para crear una aplicación para Windows Phone 7. Si ejecutaba el Visual Studio 2010 Express que instala el SDK no tenía problemas, pero en el Professional que ya tenía instalado no había manera. Tras buscar por google di con la respuesta en un foro de la MSDN donde decía que si tu Visual Studio 2010 estaba en inglés el SDK a instalar debía ser el inglés, sino, las plantillas podía no instalarse correctamente (me hizo gracia el comentario de "podían"). Y yo me había descargado el SDK en español, bueno, realmente ni me había fijado. Mientras me descargaba la ISO inglesa del SDK desinstalé el SDK español. Tras lanzar de nuevo la instalación me tocó desinstalar a mano todo lo relacionado con el Expression Blend, así que otros minutos divertidos delante del ordenador viendo barras de progreso. Bien, con todo esto superado, y tras instalar el SDK en inglés, las plantillas para crear una aplicación Windows Phone 7 estaban disponibles en mi Visual Studio.

Tras crear un proyecto y simplemente cambiar el texto de un label, ejecuté la aplicación. Pensaba que ya nada más podría ir mal, pero me equivoqué. El Visual Studio me dio el siguiente error

Error 1 Connection failed because of invalid command-line arguments. 0 0

Tocaba otra vez, lanzarme a buscar la solución en google. En diversos foros y páginas web encontré las siguiente soluciones, que desde ya advierto que no funcionan (por lo menos a mi)
  • Cerrar la solución y borrar todos los ficheros .user y .suo. 
  • Lanzar el Visual Studio con privilegios de administrador.
Desesperado iba a abandonar, pero revisando lo que se me había instalado con el SDK vi que estaba el emulador de Windows Phone. Ya que no podía ver la aplicación funcionando lo mismo podría entretenerme viendo el emulador. Al lanzar el emulador, y como no podía ser de otra manera me dio un error.


El programa no puede iniciarse porque falta 'MfPlat.DLL" en el equipo. Intente reinstalar el programa para corregir este programa.

¿Algo más podía ir mal? Una vez más tocada tirar de google. La mayoría de las soluciones pasaban por descargar la DLL de algun repositorio de DLLs e irla copiando por diversas carpetas del sistema. Solución que por supuesto descarte totalmente. En un foro de MSDN vi que si tu sistema operativo era de la serie N había que instalar el Media Feature Pack for Windows 7 N desde aquí. Y como mi Windows es serie 7N, me tocó descargar el paquete de 300MB e instalarlo.

Tras varios minutos de descarga e instalación, volví a abrir la solución. Y tras un par de segundos de compilación vi como se abría el emulador y un momento después mi primera ¿aplicación?  para Windows Phone 7 veía la luz...



viernes, 27 de abril de 2012

Introducción al Sql Injection en MySql

Después de leer este comentario "Eso con MySql no pasaría. Esas cosas solo le pasan al Sql Server porque es de Microsoft..." en mi artículo sobre Introducción al Sql Injection en Sql Server no me he quedado más remedio que realizar el mismo experimento pero esta vez sobre MySql. Voy a dejar fuera del artículo como instalar las cosas que se necesitan para probar el código pero básicamente son
También nos lo podemos bajar todo junto de aquí.

Bien, con todo montado y funcionando lo primero que haremos será crear una tabla User similar a la anterior e insertar un registro. Podemos hacerlo usando las siguientes sentencias SQL
CREATE  TABLE `test`.`User` (
  `IdUser` INT NOT NULL AUTO_INCREMENT ,
  `Username` VARCHAR(50) NOT NULL ,
  `Password` VARCHAR(200) NOT NULL ,
  `Name` VARCHAR(50) NOT NULL ,
  PRIMARY KEY (`IdUser`) ,
  UNIQUE INDEX `IX_Username` (`Username` ASC) );

INSERT INTO `test`.`User` (`Username`, `Password`, `Name`) VALUES ('admin', 'admin', 'Administrador');
Y montaremos una aplicación con el mismo aspecto que la que usamos en el anterior artículo.


Tras esto pondremos este código en el manejador del evento Click del botón
try
{
 string connectionString = ConfigurationManager.ConnectionStrings["Foo"].ConnectionString;
 using (MySqlConnection connection = new MySqlConnection(connectionString))
 {
  connection.Open();
  string cmdText = "SELECT * FROM User WHERE Username='" + textUsername.Text + "' AND Password='" + textPassword.Text + "'";
  MySqlCommand command = new MySqlCommand(cmdText, connection);
  MySqlDataReader dataReader = command.ExecuteReader();
  if (dataReader.HasRows)
  {
   dataReader.Read();
   string name = dataReader["Name"].ToString();
   labelStatus.Text = "Bienvenido al sistema " + name;
  }
  else
   labelStatus.Text = "Nombre de usuario o contraseña incorrectos";
 }
}
catch (Exception ex)
{
 labelStatus.Text = ex.Message;
}
Bien, ahora es el momento de hacer las mismas pruebas que hicimos con el Sql Server.
Si ponemos el usuario y la contraseña de manera correcta


Y si la ponemos de manera incorrecta


Ahora toca hacer el Sql Injection, pero como no uso normalmente MySql no me queda más remedio que buscar como comentar una linea a partir de un carácter (o caracteres). La solución está aquí y es usando el carácter #. Con esto usaremos ' OR 1=1 #  como nombre de usuario y el resultado es el siguiente


Como vemos, hemos accedido al sistema simplemente conociendo un nombre de usuario, al igual que ocurría con el Sql Server. Para corregir este fallo de seguridad usaremos parámetros tal y como hicimos en el anterior artículo
try
{
    string connectionString = ConfigurationManager.ConnectionStrings["Foo"].ConnectionString;
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string cmdText = "SELECT * FROM User WHERE Username=?Username AND Password=?Password";
        MySqlCommand command = new MySqlCommand(cmdText, connection);
        command.Parameters.Add(new MySqlParameter("?Username", textUsername.Text));
        command.Parameters.Add(new MySqlParameter("?Password", textPassword.Text));
        MySqlDataReader dataReader = command.ExecuteReader();
        if (dataReader.HasRows)
        {
            dataReader.Read();
            string name = dataReader["Name"].ToString();
            labelStatus.Text = "Bienvenido al sistema " + name;
        }
        else
            labelStatus.Text = "Nombre de usuario o contraseña incorrectos";
    }
}
catch (Exception ex)
{
    labelStatus.Text = ex.Message;
}
En este caso si usáramos el mismo nombre de usuario obtendríamos el siguiente resultado


Como vemos del Sql Injection no se escapa "casi nadie" sobre todo si somos nosotros mismos los que hacemos las cosas mal y no validamos la información introducida por el usuario.

miércoles, 25 de abril de 2012

Entity Framework Code First DbMigration (II)

En el anterior artículo sobre las migraciones automáticas en Entity Framework vimos como lanzar las migraciones desde la Package Manager Console de Visual Studio. La pregunta ahora sería, ¿podemos lanzar las migraciones desde el código de nuestra aplicación?, y la respuesta como no cabía esperar de otra manera es que si.

Para crear los ficheros de migración seguiremos usando la consola siguiendo los pasos descritos en el artículo anterior, pero para actualizar la base de datos haremos lo siguiente:
var config = new Migrations.Configuration();
var dbMigrator = new DbMigrator(config);
dbMigrator.Update();
Esto lanzará las migraciones pendientes. En caso que queramos lanzar una migración en concreto tendremos que indicárselo al método Update de la siguiente manera
var config = new Migrations.Configuration();
var dbMigrator = new DbMigrator(config);
dbMigrator.Update("201204191333459_InitialCreate");
Como vemos es bastante fácil lanzar nuestras actualizaciones desde código, pero cuidado con lo que hacemos sobre todo si la base de datos está en producción no sea que nos llevemos sorpresas desagradables.

Happy coding!

Mas info | Entity Framework Code First DbMigration (I)

martes, 24 de abril de 2012

CS0012: El tipo 'System.Data.Objects.DataClasses.EntityObject' está definido en un ensamblado al que no se hace referencia...

Hoy, haciendo una prueba me he tropezado el siguiente error al intentar usar un objecto definido en el modelo del Entity Framework

Mensaje de error del compilador: CS0012: El tipo 'System.Data.Objects.DataClasses.EntityObject' está definido en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

Lo que estaba haciendo en la vista era lo siguiente
@model Model.Persona
@{
    ViewBag.Title = "Detalle";
    Layout = "~/Views/Shared/_Public.cshtml";
}
<h2>@Model.Nombre</h2>
Vamos algo relativamente normal. Lo curioso del error era que mi proyecto ASP.NET MVC si tenía agregada la referencia a System.Data.Entity como se puede ver en la imagen


La solución pasa por añadir la referencia a System.Data.Entity en el web.config de la manera siguiente
<system.web>
  <compilation debug="true" targetFramework="4.0">
    <assemblies>
      <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </assemblies>
  </compilation>
</system.web>

Happy coding!

lunes, 23 de abril de 2012

Instalar el widget de karmacracy en blogger

Recientemente me he dado de alta en Karmacracy, un fenomenal servicio para compartir contenidos que va más alla de los clásicos acortadores de url como bit.ly, goo.gl o hootsuite. El principal problema que he tenido ha sido configurar su widget al final de cada post, ya que cada vez que insertaba el código en la plantilla que me da blogger obtenía el siguiente error 
Error parsing XML, line 1366, column 125: The reference to entity "type" must end with the ';' delimiter.
Al final lo he conseguido, y los pasos a seguir son  los siguientes
  1. Ir a la sección Templates
  2. Ir a Edit HTML
  3. En la pregunta contestar Proceed
  4. Marcar la opción Expand Widget Templates
  5. Buscar class='post-footer'
  6. Insertar en ese bloque el código del widget obtenido desde la página de Karmacracy sustituyendo todos los & por su codificación html tal y como se muestra en la imagen


Con esto ya tendremos el widget de Karmacracy funcionando correctamente al final de cada post de nuestro blog. Ahora sólo queda esperar a que nuestros lectores compartan el contenido de nuestro blog en su círculo.



Mas info | Karmacracy