Categories
.NET Windows Forms

Tip: Permitir sólo la entrada de números en un TextBox

Una forma sencilla de limitar que los usuarios sólo puedan ingresar números en determinados TextBox es la siguiente:

csharp:

public Form1()
{
    InitializeComponent();

    textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
}
void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    // Permitir sólo las teclas de control o números
    if (!(char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar)))
    {
        e.Handled = true;
    }
}

Puse a disposición el proyecto de prueba por si alguién está interesado.

Actualización: La porción de código mostrada todavía permite la entrada de otros caracteres (vía copiar & pegar), queda como tarea para el interesado completar la implementación de este ejemplo.

Categories
.NET AJAX ASP.NET Recursos Web

Ebook: Introducing Microsoft code name “Atlas” for ajax development

Para los interesados, el título hace referencia a un libro gratuito de unas 147 páginas, en el que se habla de Microsoft Atlas (antiguo nombre para el ahora denominado Microsoft Ajax) para el desarrollo de aplicaciones Web.

El libro está basado en el CTP de Julio de 2006, dividido en 4 capítulos:

  • Building Blocks of AJAX-Style Web Applications
    • The Paradigm Shift
    • The XmlHttpRequest Object
    • Existing AJAX Frameworks in .NET
    • Conclusion
  • Building Blocks of the Atlas Application Framework
    • The Atlas Architecture
    • The Programming Model of Atlas
    • A Sample Atlas Page
    • Conclusion
  • Updatable Page Fragments
    • Atlas Server Controls
    • Enabling Page Partial Rendering
    • Taking Control of Page Updates
    • Providing User Feedback During Updates
    • Conclusion
  • Atlas Controls and Extenders
    • The Atlas Control Toolkit
    • The Accordion Control
    • The Rating Control
    • The ReorderList Control
    • Atlas Server Extenders
    • Conclusion

Pueden descargarlo desde la siguiente dirección.

Categories
.NET ASP.NET Seguridad Web XSS

ValidateRequest no es suficiente para protegernos de ataques XSS

En una entrada anterior ya había advertido que la validación que ofrece la propiedad ValidateRequest es muy básica como para sólo confiar en ésta. Para probar esta afirmación tomaremos como ejemplo el siguiente código que seguramente muchos escribimos alguna vez y que otros todavía lo siguen haciendo 🙁

html:

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= Request.Params["Mensaje"] %>
       
        <a href="<%= Request.Params["Uri"] %>">¡Hola!</a>
    </div>
    </form>
</body>
</html>

Conseguir ejecutar javascript usando el parámetro Mensaje, es un poco fastidioso, porque hay que evitar usar las cadenas <[a-z!] para evitar una excepción del tipo HttpRequestValidationException, por ejemplo para http://aspspider.org/buayacorp/xss.aspx?Mensaje=<script> se produce el siguiente error:

A potentially dangerous Request.QueryString value was detected from the client (Mensaje="<script>").

Description: Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. You can disable request validation by setting validateRequest=false in the Page directive or in the configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case.

Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.QueryString value was detected from the client (Mensaje="<script>").

Revisando uno de los hilos de los foros de sla.ckers.org, uno de los miembros comentó que -para variar- Internet Explorer interpreta los atributos que se ponen en el cierre de algunas etiquetas HTML (</a style=xss:expression(alert(/XSS/))>). Aprovechando este vector de ataque, entonces un ejemplo válido para conseguir ejecutar javascript es http://aspspider.org/buayacorp/xss.aspx?Mensaje=</a style=xss:expression(alert(/XSS/))>.

En el segundo caso que involucra al parámetro Uri es más sencillo, puesto que no se necesita de ningún caracter < para poder ejecutar javascript, para la siguiente dirección http://aspspider.org/buayacorp/xss.aspx?Uri=" style=xss:expression(alert(/XSS/)) " se genera:

html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
        Untitled Page
</title></head>
<body>
    <form name="form1" method="post" action="xss.aspx?Uri=%22+style%3dxss%3aexpression(alert(%2fXSS%2f))+%22" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEzNDEyMDg2NjZkZCXpsuyzajePI7u8zKPoDxOfXJHy" />
</div>

    <div>
       
       
        <a href="" style=xss:expression(alert(/XSS/)) "">Click</a>

    </div>
    </form>
</body>
</html>

Si entre la audiencia todavía existen desarrolladores que confían en la validación por omisión que trae ASP.NET, es hora de empezar a utilizar los métodos que trae la clase HttpUtility o mejor aún el denominado Microsoft Anti-Cross Site Scripting Library 😉

Categories
.NET Seguridad Sql Injection WTF

Administrar comillas utilizando el método Replace de la clase String

El título hace referencia a un artículo -bastante preocupante por cierto- publicado en el sitio web de El Guille, en el que se presenta una función para evitar el problema con las comillas simples cuando se concatenan sentencias SQL.

En este ejemplo veremos cómo utilizar el método Replace de la clase String. Este ejemplo reemplaza comillas simples entre dos comillas simples adyacentes para asegurarse de que los datos tienen el formato correcto cuando se concatenan valores para una instrucción SQL.

El código que se muestra es el siguiente (en mi opinión, código candidato para WTF):

csharp:

public string QuitarApostrofe(string vCadena)
{
    vCadena = vCadena.Replace("'", "''");
    return vCadena;
}

public void e50factu()
{
    //Cadena a la cual se le va a sustituir la comilla.
    string MiCadena = QuitarApostrofe("WARNER'S DE MEXICO SA DE CV ");
    //Abro la conexion
    ConecServer.Open();
    OleDbCommand mycmd = ConecServer.CreateCommand();
    OleDbTransaction Trans;
    Trans = ConecServer.BeginTransaction(IsolationLevel.ReadCommitted);
    mycmd.Connection = ConecServer;
    mycmd.Transaction = Trans;
    try
    {
        strSQL = "INSERT INTO e50factu(serie50,numero50,descri50) " +
            "VALUES ('" + clsVariables.vSerie + "'," + 20356 + ",'" + MiCadena + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        strSQL = "INSERT INTO A50COTI(folio,factura,usuario,hora,serie)" +
            "VALUES(" + 1 + "," + 20356 + "," + "evallejo" + ",'" + "12:00" + "','" + "B" + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        Trans.Commit();
    }
    catch (System.Exception error)
    {
        try
        {
            Trans.Rollback();
            MessageBox.Show("Ocurrio un error, no se realizo ningún cambio en la base de datos" +
                error.Message,
                "Guardar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (OleDbException ex)
        {
            if (Trans.Connection != null)
            {
                MessageBox.Show("Ha ocurrido una excepción grave de tipo " + ex.GetType());
            }
        }
    }
    finally
    {
        ConecServer.Close();
    }
}

Personalmente creo que el hecho de que se publiquen o dejen pasar este tipo de recursos en un sitio bastante popular, puede hacer daño a aquellos que recién empiezan y consideran que todo lo que se publica ahí sea información útil y fiable.

Categories
.NET ASP.NET Hosting

Hosting en Windows

Ando en busca de un servicio de hosting pequeño y barato para colgar unos ejemplos, básicamente debe cumplir las siguientes cosas:

  • Soporte para ASP.NET 2
  • Una base de datos Sql Server, PostgreSQL o MySQL (Access no cuenta 😀 )
  • Que no se caiga con mucha frecuencia 🙂

¿Alguien de la audiencia puede recomendarme algún proveedor de hosting?