Cuando hablamos del desarrollo de cualquier aplicación web, la seguridad es una parte crucial que no puede ser ignorada y debe ser tomada en consideración desde el comienzo del desarrollo de la misma. De esta manera reducimos el riesgo de que la aplicación funcione de manera incorrecta o imprevista y nos protegemos de ataques mal intencionados.

Los siguientes pasos son una guía para hacer de nuestra aplicación una más segura, proteger la data que la aplicación administra, y mantener el buen funcionamiento de la misma.

  1. Validar los input que la aplicación deba de interpretar

    Quizás este sea el punto más básico y, a su vez, el más importante a la hora de hacer una aplicación web segura. Por este punto nuestra aplicación web puede ser atacada utilizando varios tipos de ataques como lo son sql injection y cross site scritping. Para evitar estos ataques debemos validar cualquier campo que el usuario pueda insertar data como lo es un campo de búsqueda o una forma de contacto. Pero, ¿qué debo de validar para asegurar mi aplicación? Debemos validar que el usuario no inserte caracteres especiales que puedan comprometer el buen funcionamiento de nuestro sistema. Por ejemplo, en una forma donde el usuario inserta sus credenciales, puede poner ‘ or 1 = 1 — en el campo de nombre de usuario. Si nuestra aplicación no está preparada para recibir esto tipo de entrada y simplemente utiliza este valor para usarlo en un query, quedaría de la siguiente manera:

    SELECT * FROM USUARIOS WHERE NOMBRE_USUARIO = '' or 1 = 1 --' AND PASSWORD = ''
    

    El query cambia completamente a favor del atacante. Ahora la condición que fue programada es reemplazada por otra que siempre sera cierta. Esto permite que, no importa lo que el usuario introduzca en el encasillado de la contraseña, el sistema le va a permitir el acceso por que 1 siempre sera igual a 1. Así como pudo acceder al sistema, podría obtener información confidencial o sensitiva que nuestra aplicación almacene. Es por esta razón que nunca debemos confiar en lo que el usuario entra en nuestra aplicación. Además de validar campos textbox, tambien debemos validar entradas como lo son los cookies, objectos en formato JSON, llamadas hechas con AJAX y parámetros pasados a través del URL.

  2. Usar los cookies como httpOnly para prevenir ataques cross site scripting

    Cuando los cookies pueden ser accesado desde el navegador hace a la apliación vulnerable a ataques Cross Site Scripting (XSS). Estos ataques funcionan cuando un tercero inyecta código JavaScript, u otro lenguaje de tipo script, evitando el buen funcionamiento de la aplicación. Este código inyectado, puede crear cookies que simulan credenciales u otro tipo de información sensitiva.

    Para prevenir este tipo de ataque, además de validar los inputs que vimos en el punto 1, podemos hacer que los cookies solamente puedan ser accedidos desde el servidor web, y no desde el navegador, cambiando en nuestro archivo web.config la siguiente propiedad.

    <system.web>
        <httpCookies httpOnlyCookies="true"/>
    </system.web>
    

  3. Usar SSL

    Encriptar la comunicación entre cliente y servidor es sumamente importante. Para esto se utiliza Secure Socket Layer (SSL) que hace exactamente eso mismo. Encripta la comunicación entre el cliente (navegador) y el servidor. Hoy día existen certificados de seguridad SSL económicos que pueden ser de gran utilidad.

  4. Eliminar la información del servidor IIS (versión, etc.) que contiene el header del response

    En la respuesta de cada pedido al servidor, exactamente en el header, normalmente se incluye información del servidor web. Esto incluye versión del IIS, versión de ASP, etc. Esta información puede ser de gran utilidad para un atacante al momento de escoger la estrategia y el tipo de ataque que va a usar. Por ejemplo si la versión de ASP que se está usando contiene un bug el cual ha sido exploit anteriormente, el atacante puede usar esa vulnerabilidad para atacar a nuestra apliación web.

    Par mitigar este problema vamos al we.config y añadimos lo siguiente:

    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
    

  5. Usar SqlParameters al momento de crear queries en el código

    .Net nos provee una gran herramienta para protegernos contra queries que podrían estar mal formados por falta de validación de campos, los SqlParmeters.

    string id = "' or 1=1 --";
    string query = "SELECT * FROM PRODUCTOS WHERE ID = '" + id + "'";
    

    En el pedazo de código de arriba hay un query que va estar formado de una manera que no es la esperada y que, a su vez, devolverá información que, tampoco, es la esperada. En vez de traer la información de un solo producto, el query, devolverá la información de todos los productos que contenga dicha tabla. SqlParameters evita exactamente eso. El mismo valida el parámetro de que no contenga caracteres que puedan poner en riesgo el query y luego o inserta e el mismo. El siguiente pedazo de código muestra como se usan los SqlParameters.

    SqlCommand.CommandText = "SELECT * FROM PRODUCTOS WHERE ID = @Parametro";
    SqlCommand.Parameters.Add(new SqlParameter("@Parametro", valor));
    

    Así que, siempre que nos sea posible, debemos usar SqlParameters.

Conclusión

La seguridad es un área al que se le está dando mucho énfasis últimamente y no es para menos. Es un área donde hay mucho que mejorar y donde muchos de los programadores no tienen el conocimiento que necesitan para poder hacer una aplicación segura. Espero que este artículo les ayude y que les despierte la curiosidad.