Publicado en ASP.NET, Silverlight, WebCast

CPOO en Silverlight – Clases y Objetos – 04


En el siguiente WEBCAST se ve el compendio de los temas tratados hasta el momento, Clases, Objetos en aplicaciones Silverlight.

Código de la clase Balón:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_01_Clases_Demo
{
    public class Balon
    {
        private const double distancia = 10;
        public Ellipse Grafico { get; set; }

        public Balon()
        {
            Grafico = new Ellipse();
            Grafico.Height = 50;
            Grafico.Width = 50;
            Grafico.Fill = new SolidColorBrush(Colors.Green);
        }

        public void MoverArriba()
        {
            double posTop = (double)Grafico.GetValue(Canvas.TopProperty);
            posTop -= distancia;
            Grafico.SetValue(Canvas.TopProperty, posTop);
        }

        public void MoverAbajo()
        {
            double posTop = (double)Grafico.GetValue(Canvas.TopProperty);
            posTop += distancia;
            Grafico.SetValue(Canvas.TopProperty, posTop);
        }

        public void MoverIzquierda()
        {
            double posLeft = (double)Grafico.GetValue(Canvas.LeftProperty);
            posLeft -= distancia;
            Grafico.SetValue(Canvas.LeftProperty, posLeft);
        }

        public void MoverDerecha()
        {
            double posLeft = (double)Grafico.GetValue(Canvas.LeftProperty);
            posLeft += distancia;
            Grafico.SetValue(Canvas.LeftProperty, posLeft);
        }
    }
}

Código de la clase MainPage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_01_Clases_Demo
{
    public partial class MainPage : UserControl
    {
        Balon balon;
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            balon = new Balon();
            LayoutRoot.Children.Add(balon.Grafico);
        }

        private void btArr_Click(object sender, RoutedEventArgs e)
        {
            balon.MoverArriba();
        }

        private void btIzq_Click(object sender, RoutedEventArgs e)
        {
            balon.MoverIzquierda();
        }

        private void btAba_Click(object sender, RoutedEventArgs e)
        {
            balon.MoverAbajo();
        }

        private void btDer_Click(object sender, RoutedEventArgs e)
        {
            balon.MoverDerecha();
        }
    }
}

Código de la UI para el manejo del Balón:

<UserControl x:Class="Silverlight_CPOO_01_Clases_Demo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Canvas x:Name="LayoutRoot" Background="White">
        <Button Canvas.Left="244" Canvas.Top="227" Content="Arriba" Height="23" Name="btArr" Width="75" Click="btArr_Click" />
        <Button Canvas.Left="163" Canvas.Top="256" Content="Izquierda" Height="23" Name="btIzq" Width="75" Click="btIzq_Click" />
        <Button Canvas.Left="244" Canvas.Top="256" Content="Abajo" Height="23" Name="btAba" Width="75" Click="btAba_Click" />
        <Button Canvas.Left="325" Canvas.Top="256" Content="Derecha" Height="23" Name="btDer" Width="75" Click="btDer_Click" />
    </Canvas>
</UserControl>

Publicado en .NET, ASP.NET, POO, Silverlight, WebCast

CPOO en Silverlight – Clases y Objetos – 03


Después de haber estudiado el concepto de Clase y Objeto pasemos a estudiar algunos objetos de silverlight.

DEFINAMOS

LAYOUT

Para empezar con silverlight se deben tener claros conceptos tales como en que forma se van a posisionara los controles (objetos) y que objetos me permiten organizar visualmente la UI (interfaz de usuario) de forma tal que para el usuario una aplicación sea atractiva y funcional.

Objetos de tipo Panel tales como canvas, grid, stackpanel son muy importantes a la hora de implementar el layout o UI (interfaz de usuario) en una aplicación Silverlight.

PRACTIQUEMOS

1 – Grid : Objeto contenedor  para posicionar elementos de la UI en aplicaciones Silverlight, en forma de tabla o cuadricula.

XAML

<Grid x:Name="LayoutRoot" Background="White" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <Button Name="BT00" Content="0 0" Grid.Column="0" Grid.Row="0" FontSize="28"></Button>
            <Button Name="BT01" Content="0 1" Grid.Column="1" Grid.Row="0" FontSize="28"></Button>
            <Button Name="BT02" Content="0 2" Grid.Column="2" Grid.Row="0" FontSize="28"></Button>

            <Button Name="BT10" Content="1 0" Grid.Column="0" Grid.Row="1" FontSize="28"></Button>
            <Button Name="BT11" Content="1 1" Grid.Column="1" Grid.Row="1" FontSize="28"></Button>
            <Button Name="BT12" Content="1 2" Grid.Column="2" Grid.Row="1" FontSize="28"></Button>

            <Button Name="BT20" Content="2 0" Grid.Column="0" Grid.Row="2" FontSize="28"></Button>
            <Button Name="BT21" Content="2 1" Grid.Column="1" Grid.Row="2" FontSize="28"></Button>
            <Button Name="BT22" Content="2 2" Grid.Column="2" Grid.Row="2" FontSize="28"></Button>
        </Grid>

Viendo el anterior código se observa dentro del Grid, una sección Grid.ColumnDefinitions, una Grid.RowDefinitions las dos anteriores permiten determinar el número de columnas y el número de filas respectivamente. La definición de cada objeto tipo botón se hace a través de las propiedades Grid.Column y Grid.Row referentes a la fila y columna respectiva como se ve en la imagen inferior.

Código XAML

<UserControl x:Class="Silverlight_CPOO_Clases_03.MainPage"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            mc:Ignorable="d"
            d:DesignHeight="800" d:DesignWidth="400">
    <Grid Name="LayoutPrincipal">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid x:Name="LayoutRoot" Background="White" Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <Button Name="BT00" Content="0 0" Grid.Column="0" Grid.Row="0" FontSize="28"></Button>
            <Button Name="BT01" Content="0 1" Grid.Column="1" Grid.Row="0" FontSize="28"></Button>
            <Button Name="BT02" Content="0 2" Grid.Column="2" Grid.Row="0" FontSize="28"></Button>

            <Button Name="BT10" Content="1 0" Grid.Column="0" Grid.Row="1" FontSize="28"></Button>
            <Button Name="BT11" Content="1 1" Grid.Column="1" Grid.Row="1" FontSize="28"></Button>
            <Button Name="BT12" Content="1 2" Grid.Column="2" Grid.Row="1" FontSize="28"></Button>

            <Button Name="BT20" Content="2 0" Grid.Column="0" Grid.Row="2" FontSize="28"></Button>
            <Button Name="BT21" Content="2 1" Grid.Column="1" Grid.Row="2" FontSize="28"></Button>
            <Button Name="BT22" Content="2 2" Grid.Column="2" Grid.Row="2" FontSize="28"></Button>
        </Grid>

    </Grid>
</UserControl>

Y para la carga del Grid desde C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_Clases_03
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            //Inicialización de un objeto Grid
            Grid grid = new Grid();

            //Definición de Columnas
            grid.ColumnDefinitions.Add(new ColumnDefinition());
            grid.ColumnDefinitions.Add(new ColumnDefinition());
            grid.ColumnDefinitions.Add(new ColumnDefinition());

            //Definición de Filas
            grid.RowDefinitions.Add(new RowDefinition());
            grid.RowDefinitions.Add(new RowDefinition());
            grid.RowDefinitions.Add(new RowDefinition());

            //Primera fila de botones/////////////////
            Button button00 = new Button();
            button00.SetValue(Grid.ColumnProperty, 0);
            button00.SetValue(Grid.RowProperty, 0);
            button00.Content = "0 - 0";
            grid.Children.Add(button00);

            Button button01 = new Button();
            button01.SetValue(Grid.ColumnProperty, 1);
            button01.SetValue(Grid.RowProperty, 0);
            button01.Content = "0 - 1";
            grid.Children.Add(button01);

            Button button02 = new Button();
            button02.SetValue(Grid.ColumnProperty, 2);
            button02.SetValue(Grid.RowProperty, 0);
            button02.Content = "0 - 2";
            grid.Children.Add(button02);
            ////////////////////////////////////////////

            //Segunda Fila//////////////////////////////
            Button button10 = new Button();
            button10.SetValue(Grid.ColumnProperty, 0);
            button10.SetValue(Grid.RowProperty, 1);
            button10.Content = "1 - 0";
            grid.Children.Add(button10);

            Button button11 = new Button();
            button11.SetValue(Grid.ColumnProperty, 1);
            button11.SetValue(Grid.RowProperty, 1);
            button11.Content = "1 - 1";
            grid.Children.Add(button11);

            Button button12 = new Button();
            button12.SetValue(Grid.ColumnProperty, 2);
            button12.SetValue(Grid.RowProperty, 1);
            button12.Content = "1 - 2";
            grid.Children.Add(button12);
            ////////////////////////////////////////////

            ///Tercer Fila//////////////////////////////
            Button button20 = new Button();
            button20.SetValue(Grid.ColumnProperty, 0);
            button20.SetValue(Grid.RowProperty, 2);
            button20.Content = "2 - 0";
            grid.Children.Add(button20);

            Button button21 = new Button();
            button21.SetValue(Grid.ColumnProperty, 1);
            button21.SetValue(Grid.RowProperty, 2);
            button21.Content = "2 - 1";
            grid.Children.Add(button21);

            Button button22 = new Button();
            button22.SetValue(Grid.ColumnProperty, 2);
            button22.SetValue(Grid.RowProperty, 2);
            button22.Content = "2 - 2";
            grid.Children.Add(button22);
            /////////////////////////////////////////////

            //Por último se agrega el nuevo Grid al layout
            //Principal y así poder comparar las dos formas
            //mencionadas.
            grid.SetValue(Grid.RowProperty, 1);
            LayoutPrincipal.Children.Add(grid);
        }
    }
}

Tal como se ve en el código de C# la Programación Orientada a Objetos es muy importante a la hora de crear controles dinámicos para una aplicación de silverlight, pero es innegable la facilidad y legibilidad del código XAML a la hora de definir objetos de la UI.

Si inspeccionamos un poco los objetos de Silverlight como button o grid se puede ver allí que hay diferentes métodos y propiedades. Sin profundizar mucho en estas instancias, clases y tipos de objeto es posible afirmara que:

button21.SetValue(Grid.ColumnProperty, 1);

A través de este método se puede establecer el valor index referente de la propiedad Column en la que se va a posicionar el objeto button, una vez sea agregado al control Grid.

button21.SetValue(Grid.RowProperty, 2);

En este caso y de igual forma que en el anterior se establece la posición pero referente a la fila del Grid.

button21.Content = “2 – 1”;

El objeto button dispone de una propiedad Content (de tipo object) la cual permite registrar cual va a ser el contenido del botón, en este caso un texto.

grid.Children.Add(button21);

El objeto Grid contiene una propiedad Children (de tipo UIElementCollection), en la cual se puede hacer uso del método Add para agregar cada elemento al control contenedor.

Así pues se empieza a notar que de la Programación Orientada a Objetos en Silverlight, permite a través de las propiedades y métodos de un objeto poder configurar y en este caso a un botón darle su respectiva posición cuando es agregado a un control Grid desde código. Aclarando que la forma estándar de hacer esto es crear la UI en código XAML el cual es por mucho, más fácil, flexible y legible.

Publicado en .NET, ASP.NET, C#, Microsoft, POO, Silverlight, WebCast

CPOO en Silverlight – Clases y Objetos – 02


En el anterior post se dio un vistazo al concepto de clase y objeto, veamos unos temas de mayor relevancia a la hora de programar de forma orientada a objetos.

DEFINAMOS

¿Qué es un Constructor ?

Una vez se instancie una clase, es decir, se cree un Objeto, el Constructor permite la configuración de dicho Objeto, de forma tal que se puedan inicializar variables, estados, eventos o procesos para que el objeto pueda ser usando e interactúe con otros objetos.

Por ejemplo supongamos que Victor tiene un  porshe convertible. Y digamos que quiere sacar su carro de día. Por lo que elige tener un carro sin capota y que le permita recibir aire.

Pero Victor al otro día sale en la noche y quiere un coche que sea  más confortable y pueda evitar el frió por ejemplo.

Según lo anterior, el constructor permite crear una instancia de carro con capota y otra sin capota, según Victor lo requiera.

PRACTIQUEMOS

Teniendo una nueva solución, creamos la clase carro:

Clase carro:

En una primera vista la clase con construcutor irá de la siguiente forma:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_Clases_02
{
    public class Carro
    {
        ///
<summary> /// Constructor, debe llevar el mismo nombre de la clase.
 /// </summary>
        public Carro()
        {

        }
    }
}

Ahora si especificamos la inicialización de un objeto a través de un constructor el cual me permita configurar si el carro tiene capota o no, el diagrama y código será de la siguiente forma:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_Clases_02
{
    public class Carro
    {
        ///
<summary> /// Propiedad privada para la clase carro
 /// que indica si el carro tiene o no capota
 /// </summary>
        private bool _TieneCapota;

        ///
<summary> /// Constructor para la clase Carro que permite inicializar
 /// la variable que indica si el carro tiene o no
 /// capota.
 /// </summary>
        public Carro(bool tieneCapota)
        {
            //Se establece el valor de la propiedad
            //privada del objeto que de va a instanciar.
            _TieneCapota = tieneCapota;
        }
    }
}

Respecto a la propiedad privada de la clase, resta indicar por ahora que simplemente es una variable que sólo la clase podrá modificar internamente, es decir dentro de cualquier parte del código encerrado por la definición de la clase.

Publicado en .NET, ASP.NET, C#, Microsoft, Silverlight, WCF, WebCast

Creando una aplicación para Twitter con Silverlight y WCF – (TweetRobot) @DotNeteros


Un RSS consiste en una fuente de datos en formato xml  usada para presentar noticias o información actualizada de un tema en específico.

Hoy día Twitter está minado de un sin fin  de Robots que hacen este tipo de actualizaciones, bien sea periódicamente o automáticamente.  Hasta cierto punto es bueno tener un motor dedicado a este tipo de trabajo y no tener nosotros que convertirnos en ese Robot! dedicando nuestros días a copiar y pegar links, que siendo muchos de estos provechosos, es una tarea que toma bastante tiempo y sacrificio, entonces, si lo que quieres es compartir fuentes de datos esta podría ser una solución :D!

Indice

  1. Crear una aplicación en Twitter en tan solo segundos.
  2. API para hacer update TwitterStatus.
  3. Creación de UI con Silverlight para nuestro TweetRobot (ListBox – ItemTemplate).
  4. IsolatedStorage en Silverlight (Manejo de archivos XML)
  5. Creación y configuración  de un servicio WCF  para comunicación con TweetRobot.
  6. Helpers y Componentes para implementar funcionalidad de Tweets.
  7. Depurando código TweetRobot.
Una de las cosas requisito para el desarrollo de este tutorial es tener una cuenta de Twitter :/, espero la tengas, de lo contrario deberias crearla, demora tan solo segundos, bueno y de paso me das el Follow ;), bueno continuando.

 

Crear una aplicación en Twitter en tan solo segundos

 

Lo primero que debemos hacer es ir al siguiente link, acá vamos a hace el login con la cuenta propia (Si no quieres causar molestias a gente escasa de paciencia :D, debes crear una nueva cuenta para este ejercicio). Ya en el portal para desarrolladores.

Como se ve,  hay una opción que se llama My Applications, allí podremos crear lo que pronto se va a convertir en nuestra primer aplicación para Twiiter. Oprimimos el botón crear aplicación.

 

 

Validamos el captcha y aceptamos los terminos,

 

 

Y como se ve en pantalla la aplicación se habrá creado en forma correcta.

 

Publicado en .NET, ASP.NET, C#, Javascript, JQuery, WebCast

CascadingDropDownList JQuery y ASP.NET


En esta oportunidad mediante un ejemplo, vamos a implementar la funcionalidad de selectores en cascada.  “Si el siguiente error, alguna vez se te atravesó  en el camino!, estás en el lugar indicado :D.”

“Invalid postback or callback argument. Event validation is enabled using in configuration or in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.”

Entonces, es necesario tomar medidas y no dejarnos llevar del pánico.

Sigue leyendo “CascadingDropDownList JQuery y ASP.NET”

Publicado en .NET, ASP.NET, C#, Javascript, JQuery, SQL, WebCast

SQL injection el riesgo de SQL Dinámico


Hola a todos, en esta oportunidad quiero compartirles un tema el cual constituye una vulnerabilidad en un sistema de gestión de datos, usando en este caso SQL Server cómo motor de bases de datos.

Muchas veces por comodidad y facilidad solemos usar SQL Dinámico, el cual básicamente consiste en flexibilizar una consulta sobre la base de datos, ¿por qué razón?, por ejemplo  imaginemos un formulario de ASP.NET en el cual tengamos filtros tales cómo podrían ser  fechas, descripción de un dato u otro valor que se desea filtrar, digamos que tenemos un control  el cual permita una funcionalidad similar a la que podemos encontrar en el buscador google (Control tipo AJAX para encontrar coincidencias por ejemplo en una BD para nuestro caso).

Ejemplo Formulario:

ASPX AJAX xon JQUERY ver post anterior

<pre><%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script type="text/javascript" language="javascript" src="Scripts/jquery-1.4.1.min.js"></script>
    <script type="text/javascript" language="javascript">
        $(document).ready(function () {
            $("#<%=TxtBusqueda.ClientID%>").keyup(function () {
                $.ajax({
                    type: "POST",
                    url: "Default.aspx/GetData",
                    dataType: "json",
                    contentType: "application/json; chartset=utf-8",
                    data: '{ "filter":"' + $(this).val() + '"}',
                    success: function (result) {
                        if (!result)
                            return;
                        if (!result.d)
                            return;
                        $("#DivResults").html("");
                        var table = $('<table></table>');
                        table.append($("<tr><td>Id</td><td>Nombre</td><td>Apellido</td></tr>"));
                        $(result.d).each(function () {
                            table.append($('<tr>' +
                                '<td>' + this.ContactID + '</td>' +
                                '<td>' + this.FirstName + '</td>' +
                                '<td>' + this.LastName + '</td>' +
                            '</tr>'));
                        });
                        $("#DivResults").append(table);
                    },
                    error: function (XmlError, error, desc) { },
                    async: true
                });
            });
        });
    </script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

    <br />
    <table>
        <tr>
            <td>
                Descripción Producto
            </td>
            <td>
                <asp:TextBox ID="TxtBusqueda" Width="500px" runat="server"></asp:TextBox>
            </td>
        </tr>
    </table>
    <br />
    <div style="background:black; width:50%;">
        <span style="color:White">Resultados : </span>
        <br />
        <div id="DivResults">

        </div>
    </div>
</asp:Content></pre>

CodeBehind: Podemos ver cómo creamos una conexión a la base de datos, y como devolvemos los datos transformados a un objeto List<T>

<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Data;
using System.Data.SqlClient;
namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [WebMethod]
        public static List<Result> GetData(string filter)
        {
            DataTable dt = new DataTable();
            List<Result> listResults = new List<Result>();
            using (SqlConnection connection = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand("Person.AWProcDinamico", connection))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Descripcion", filter);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    try
                    {
                        connection.Open();
                        da.Fill(dt);
                    }
                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                }
            }
            //Para ver una mejor forma de hacer esta parte: https://ingphillip.wordpress.com/2011/04/09/generics-t-anonymous-types-system-reflection-y-metodos-extensores-en-net/
            foreach (DataRow dRow in dt.Rows)
            {
                listResults.Add(
                    new Result
                    {
                        ContactID = dRow["ContactID"].ToString(),
                        FirstName = dRow["FirstName"].ToString(),
                        LastName = dRow["LastName"].ToString()
                    }
                );
            }
            return listResults;
        }
        public class Result
        {
            public string ContactID { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
    }
}</pre>

AHORA SUPONGAMOS:

En la base de datos AdventureWork (que en realidad puede ser una base de datos en producción con datos sensibles) creamos un “StoreProcedure dinámico para hacer un select,  en este caso un select like ” así:

	USE AdventureWorks
	GO
	ALTER PROC Person.AWProcDinamico
		@Descripcion varchar(100)
	AS
	BEGIN
		DECLARE @SQL VARCHAR(MAX)
		SET @SQL = ''
		SET @SQL = @SQL + 'SELECT Person.Contact.ContactID, Person.Contact.FirstName, Person.Contact.LastName '
		SET @SQL = @SQL + 'FROM Person.Contact WHERE FirstName Like ''%'+ @Descripcion + '%''  '
		SET @SQL = @SQL + 'ORDER BY Person.Contact.ContactID, Person.Contact.FirstName, Person.Contact.LastName'
		PRINT (@SQL)
		EXEC (@SQL)
	END
	GO

Hasta acá sólo se intentó un caso probable en el mundo real. Ahora bien si sabes que es un store procedure y cómo poderlo ejecutar desde .NET entonces entenderás que allí hemos abierto una muy sensible puerta  a los datos residentes en la base de datos.

Veamos este video de lo que es un hacking muy simple pero instructivo acerca de lo que no debemos hacer en la base con nuestra presida base de datos.

Como vimos en el video, aunque no evidente la base de datos está vulnerable, por tal razón luego de conocer el nombre de las tablas, podemos pasar a hacer cualquier tipo de consultas o updates o más grave aun deletes sobre los registros.

Cosas a tener en cuenta.

– No quemes cadenas de conexión en el Web Config,  Encriptalas!. (Te gustaría ver el artículo ?)

– No dejes abierto determinado usuario ‘sa’ u otro con permisos para manipular tablas como en nuestro caso sys.Tables

– Trata de no usar SQL dinámico en lo posible, si lo requieres, asegúrate de tener un filtro de cráteres especiales y además puedes seguir esta guía: http://msdn.microsoft.com/es-es/library/bb669091.aspx.

– Valida tanto en el cliente, cómo en el Servidor!

Saludos, espero sea de utilidad!!!

Publicado en .NET, ASP.NET, C#, Javascript, WCF, WebCast

Acceso Asíncrono en ASP.NET con ASP.NET AJAX Library y WCF Service. ASP.NET


AJAX constituye uno de los apéndices para el desarrollo de aplicaciones WEB, debido a que
ayuda a hacer eficientes las páginas aspx ¿por qué eficientes? Cuando trabajamos con comunicación normal entre el cliente y el servidor desde un Explorador Web como: IE, FireFox, Chrome etc, y necesitamos enviar una solicitud al servidor en la que pedimos por ejemplo los datos correspondientes al id de una persona, supongamos que tenemos un TextBox (se tarduce en un input type text de html) en el cual un usuario indica que su Id es 11 y pulse el botón Buscar en un formulario Web, solicitando que cómo resultado el servidor devuelva Nombre:David Peréz, Edad:10 años, Id:11 y luego en html presentar al usuario los resultados, entonces allí de forma normal se estaría haciendo un PostBack lo que se constituye como una petición web usando el protocolo http que en términos técnicos es el Request al servidor, si bien esto no tiene problemas, ocurre internamente que la página Web y su html se envía en bloques http al servidor, siendo esto una forma muy costosa de enviar los datos desde el cliente, de igual forma el resultado del servidor o lo que también pasamos a conocer cómo el Response, devuelve todo el html que el explorador pasa a pintar en el cliente haciendo el proceso de comunicación algo lento y de bajo performance.
Sigue leyendo “Acceso Asíncrono en ASP.NET con ASP.NET AJAX Library y WCF Service. ASP.NET”

Publicado en .NET, ASP.NET, C#, WebCast

Enlace a datos GridView Code-Behind C# 3 Capas ASP.NET 2-n


En este post vamos a estudiar el enlace a datos de el objeto GridView por medio de código de Servidor C#.

Vamos a hablar en primer lugar sobre cómo se puede  manipular en código las operaciones de inserción, actualización, eliminación y consulta de datos con un objeto GridView. El más importate de todos es cómo hacer el binding de la carga inicial de datos al objeto GridView y manejo de eventos relativos a las operaciones anteriormente mecionadas, veamos el siguinete Scribd para resumir en el código cómo se debe hacer esto.

Sigue leyendo “Enlace a datos GridView Code-Behind C# 3 Capas ASP.NET 2-n”