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 ;)

Published 9/10/2009 9:53 por Luis Ruiz Pavón
Archivado en: ,,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2009/10/09/malas-pr-225-cticas-sql-injection-varios-i.aspx

Comentarios

# re: Malas prácticas: SQL Injection + Varios I

Me imagino que le habrán llovido comentarios negativos a ese código pero igual lo escribió alguien que esta dando sus primeros pasos y le servirá para aprender de los errores. Yo además, habría puesto la cadena de conección en el web.config

Saludos.

Friday, October 09, 2009 12:49 PM por Abraham Laria

# re: Malas prácticas: SQL Injection + Varios I

Tampoco le vendría mas utilizar using ...

PD:

¿ Para que tenemos el API de Memebership ?

Friday, October 09, 2009 1:03 PM por Pedro

# re: Malas prácticas: SQL Injection + Varios I

que risa da la programacion, hay separar procesos de eventos, y consultas directas es un muy mal habito, por mi parte trabajo todo a travez de procedimientos, y las conexiones a la bases de datos la ocupo por servicios web con xml.

saludos !!!!

Friday, October 09, 2009 3:58 PM por rodolfo

# re: Malas prácticas: SQL Injection + Varios I

Excelente, pero podrias agregar la forma "mejor practica" de realizar esto, asi aprendemos todos saludos.

Friday, October 09, 2009 4:53 PM por manuel

# re: Malas prácticas: SQL Injection + Varios I

@manuel En cada punto he explicado el porque de cada cosa, es verdad que han faltado cosas como el uso de using para liberar recursos, no utilizar un SqlDataAdapter + DataTable cuando podría haber usado un Reader que es mucho más rápido...

Salu2

Tuesday, October 13, 2009 9:00 AM por Luis Ruiz Pavón