[Tips] Quitar los namespaces cuando serializamos con XmlSerializer

Un post corto pero muy útil sí necesitas quitar los namespaces del nodo raíz cuando usas XmlSerializer.

Ejecutando el siguiente código:

XmlSerializer serializer = 

    new XmlSerializer(typeof(Config));

 

using (TextWriter writer = new StreamWriter(@"C:tempconfig.xml"))

{

    serializer.Serialize(writer, config);

}

Obtenemos como resultado:

<?xml version="1.0" encoding="utf-8"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <solutiond>00000000-0000-0000-0000-000000000000</solutiond>

  <lcid>1033</lcid>

  <projectid>4001</projectid>

  <projecttitle>ProjectTitle</projecttitle>

  <projectdisplayname>ProjectDisplayName</projectdisplayname>

  <projectdescription>ProjectDescription</projectdescription>

  <projectcategory>ProjectCategory</projectcategory>

  <projectthumbnail>ProjectThumbnail.jpg</projectthumbnail>

  <sitemap>

    <sites>

      <Site name="Name" 

            displayname="DisplayName" 

            masterpage="MasterPage" 

            template="Template" 

            includeincurrent="true" 

            includeinglobal="true" 

            inheritcurrent="false" 

            inheritglobal="true" 

            showsiblings="false" 

            showpages="true" 

            showsites="true" />

    </sites>

  </sitemap>

</config>

Como podéis observar, en el nodo config nos aparecen los dichosos namespaces que a veces pueden resultar incomodos. Para quitarlos:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

 

ns.Add(String.Empty, String.Empty);

 

XmlSerializer serializer =

    new XmlSerializer(typeof(Config));

 

using (TextWriter writer = new StreamWriter(@"C:tempconfig.xml"))

{

    serializer.Serialize(writer, config, ns);

}

Creamos un objeto de la clase XmlSerializerNamespace, añadimos el prefijo y el namespace vacío y usamos la sobrecarga del método Serialize para pasarle el XmlSerializerNamespace que hemos creado y ahora nuestro XML sin namespaces:

<?xml version="1.0" encoding="utf-8"?>

<config>

  <solutiond>00000000-0000-0000-0000-000000000000</solutiond>

  <lcid>1033</lcid>

  <projectid>4001</projectid>

  <projecttitle>ProjectTitle</projecttitle>

  <projectdisplayname>ProjectDisplayName</projectdisplayname>

  <projectdescription>ProjectDescription</projectdescription>

  <projectcategory>ProjectCategory</projectcategory>

  <projectthumbnail>ProjectThumbnail.jpg</projectthumbnail>

  <sitemap>

    <sites>

      <Site name="Name" 

            displayname="DisplayName" 

            masterpage="MasterPage" 

            template="Template" 

            includeincurrent="true" 

            includeinglobal="true" 

            inheritcurrent="false" 

            inheritglobal="true" 

            showsiblings="false" 

            showpages="true" 

            showsites="true" />

    </sites>

  </sitemap>

</config>

¿Más limpio no? Espero que os sirva.

Salu2 y buen fin de semana a todos!!!

[ASP.NET + VS 2008] Web Deployment Projects nos facilita los despliegues de nuestras aplicaciones web

Como dije en mi anterior post, estas 3 últimas semanas, he estado desplegando una solución bastante completa en un cliente y pensaba que no me iba a dar para escribir ningún post, pero olvidé hacer mención de la herramienta:

Visual Studio® 2008 Web Deployment Projects – RTW

Seguro que tienes aplicaciones Web con varios config y settings para entornos diferentes DEV, PRE, PRO y muchas veces tienes que estar cambiando a mano dichos configs, settings… con el consiguiente riesgo de pasar settings de DEV a PRE, PRE a PRO, etc… bueno, pues esta herramienta nos va a facilitar bastante la labor de los despligues, ya que dada una configuración que nosotros mismos podemos crearnos, nos va a generar una solución lista para desplegar con sus settings correspondientes.

Vamos a ver como funciona:

Una vez descargada e instalada, vamos a generar un proyecto de prueba, en mi caso en Servicio Web sencillo y nos vamos al fichero Web.config y añadimos una cadena de conexión:

<connectionStrings>

    <add name="eShopConnectionString" 

         connectionString="Data Source=dev-sql; Initial Catalog=dev-db; Integrated Security=True"/>

  </connectionStrings>

En este caso, estaría apuntando al servidor Sql de Desarrollo. A continuación vamos a añadir a nuestra solución un Web Deployment project:

wdp

A continuación vamos a crear 3 tipos de configuración a nuestro proyecto WDP:

  1. Desarrollo (Debug)
  2. Pre-Producción (Release)
  3. Producción (Release)

wdp2

wdp3

Desarrollo

wdp4

Pre-Producción

wdp5

Producción

wdp6

Una vez creadas las 3 configuraciones, vamos a crear 3 ficheros config con las cadenas de conexión (En este caso solo contendrán una, pero podrían ser más) de cada entorno:

wdp7

Desarrollo

<connectionStrings>

  <add name="eShopConnectionString" 

       connectionString="Data Source=dev-sql; Initial Catalog=dev-db; Integrated Security=True"/>

</connectionStrings>

Pre-Producción

<connectionStrings>

  <add name="eShopConnectionString" 

       connectionString="Data Source=pre-sql; Initial Catalog=pre-db; Integrated Security=True"/>

</connectionStrings>

Producción

<connectionStrings>

  <add name="eShopConnectionString" 

       connectionString="Data Source=pro-sql; Initial Catalog=pro-db; Integrated Security=True"/>

</connectionStrings>

Ahora, solo nos queda especificar para cada configuración de las que hicimos enteriormente, de que fichero de cadenas de conexión obtendrá la configuración:

  1. Seleccionamos la configuración (Desarrollo)
  2. En la opción Deployment
  3. Activamos el check Enable Web.config file section replacement
  4. A la sección connectionStrings de nuestro Web.config lo reemplazamos con lo que contiene el fichero de configuraciones del entorno de desarrollo.
  5. Marcamos el check Enforce matching section replacements

wdp8

Y a las otras 2:

wdp7

wdp10

 

 

Una vez hecho todo el trabajo solo nos queda probar, compilamos la solcuión para cada configuración y nos vamos al directorio de nuestro proyecto y:

wdp11

cada carpeta:

wdp12

lista para desplegar con su configuración correspondiente.

Podemos hacer lo mismo con otras secciones de nuestro Web.config, como por ejemplo las appSettings 😉

La verdad es que esta herramienta me ha gustado bastante, facilita mucho el trabajo a la hora de desplegar, nosotros usabamos otras técnicas pero hemos adoptado a esta nueva herramienta.

Salu2 y a disfrutar!!!

Malas prácticas: SQL Injection + Varios I

Buenos días a todos, hace tiempo que no escribo ningún post decente y no es por falta de tiempo, sino por que actualmente estoy inmerso en un gran despliegue y la verdad es que no me da mucho para escribir sobre ello, espero que mi nuevo proyecto sí me de para compartir mis experiencias que creo que serán útiles para muchos 😉

A día de hoy Viernes 9 de Octubre de 2009 sigo encontrandome código, bien sea en aplicaciones reales y en blogs (Además sí es un blog de renombre visitado por cientos de personas más daño aún) que la verdad da miedo y luego es muy fácil encontrarte gente diciendo que .NET, C#, ASP.NET es una mierda, que es poco seguro…, no señores, no son una mierda, sino quién tira esas líneas de código, por que información al respecto hay muchisiiiiiiiiimmmmmmmmaaaa, solo hay que molestarse en buscar un poco y además este ya es un tema que huele.

Yo no me considero ningún experto, es más, creo que me falta muchiiisssiiiiiimmmmooooo camino por recorrer y aprender de muchísima gente, pero hay cosas que he aprendido y que en este caso vamos a analizar en este post, siempre desde mi punto de vista y que espero debatir amablemente con quién lo desee:

Leyendo mis rss diarias me encuentro este código:

protected void Button1_Click(object sender, EventArgs e)

{

        SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=product; User ID=sa; Password=");

        SqlCommand cmd=new SqlCommand("select * from userdetails where name='"+TextBox1.Text+"' and password ='"+ TextBox2.Text+"'",con);

        con.Open();

        SqlDataAdapter da = new SqlDataAdapter();

        DataTable dt = new DataTable();

        da.SelectCommand = cmd;

        da.Fill(dt);

 

 

        if (dt.Rows.Count != 0)

        {

            Session["UserName"] = TextBox1.Text;

            FormsAuthentication.RedirectFromLoginPage(TextBox1.Text,false);

        }

        else

        {

            // Login Unsuccessful

        }

        con.Close();

 }

No me digáis que no os duele la vista?

  1. No usar el sa (System Adminsitrator) en nuestras cadenas de conexión a la base de datos para evitar problemas de seguridad como en este caso se podrían dar, ya que debido al SQL Injection tendríamos un usuario con todos los permisos para empezar a jugar con la base de datos y con lo que no es la base de datos (Vease xp_cmdshell), en este caso podríamos utilizar un usuario con el role de datareader para hacer consultas de este tipo. Por cierto, en este caso y no es el único que he visto, veo que la password está vacia y no pondría la mano en el fuego de que no tuviera pass ya que en aplicaciones en PRO lo he visto 🙂
  2. SQL Injection: De esto casi que no hablamos porque se ha hablado ya largo y tendido del tema y se puede encontrar Mb y Mb de información gratis.
  3. SELECT * … no por favor, esto no es una buena práctica ya que si la tabla tiene 200 o más columnas el datatable será monstruoso y a parte, sí quieres saber si ese user existe, recupera sólo la información que necesitas y comprueba por ejemplo que el login que te pasan es el mismo que recuperas por ejemplo. Además de securizar ayudas a mejorar el performance yd ecargar tanto el servidor de SQL como la memoria del servidor Web.
  4. Y con esto llegamos a la 4, comprobar si existe con un count, si nos meten un ‘ or ‘’ = ‘ pues eso dará que el count es mayor que uno y “login succesful”, ale pa dentro!!! por lo menos si comrpobamos que el username que recuperamos es el mismo que nos retorna…

Lo más grave (A parte del código claro está) es el sitio donde me lo he encontrado, que solo diré que se habla mucho y mucho de ASP.NET 😉

Un saludo y a codificar bien y seguro 😉