> Manuales > Cross-Site-Scripting

Vemos el primer modo de defensa para nuestra aplicación.

Defendiendo Nuestra Aplicación.

El primer modo de defensa que veremos, será la defensa de nuestra aplicación, misma que nos enseñara técnicas sencillas para defender nuestro sitio mediante la validación de entradas de datos.

Tenemos que tener claro que lo que debemos hacer es impedir la entrada de scripts en nuestros campos de inserción de datos, validando cada entrada para asegurarnos que no contenga código que pueda afectar nuestra aplicación o a nuestros usuarios.

  1. Limitación de caracteres de entrada.
    Lo primero que debemos hacer es generar una limitante a las entradas de datos dependiendo del tipo de datos, así como lo hacemos cuando creamos un campo en una tabla de la misma manera vamos a limitar a cantidad de caracteres en los campos de entrada, por ejemplo si lo que requerimos es el nombre no vamos a dejar el campo para que el usuario ingrese cuantos caracteres quiera, si no que haremos una limitante de un máximo de caracteres, por ejemplo:

    <asp:TextBox ID="txtuname" runat="server" MaxLength="20"></asp:TextBox>

    Podemos observar que estamos limitando el campo de texto a un maximo de 20 caracteres,si intentaramos insertar un script posiblemente no nos permita escribirlo completo,<script>alert("hola" como podemos verlo en el ejemplo anterior, no pudimos terminar nuestra linea de codigo por la limitante. Sabemos que en algunos casos utilizaremos campos de mas caracteres como por ejemplo el de un comentario al que asignaremos tal vez un Maxlength de 250 0 300 caracteres, pero al menos en los campos pequeños iremos reduciendo la superficie de ataque.
  2. Validadores de campos.
    En este caso utilizaremos herramientas la disponibles en el Visual Studio, ya disponible en las herramientas de diseño en donde solo tendremos que arrastrar un control de validacion al formulario dependiendo de nuestra necesidad y editar sus propiedades para determinar su funcion, y asignar los campo de entrada de datos que administrara y su mensaje de error, de una manera sencilla y dinamica.
Required Field Validator: Este control al anclarlo a un control de insersion de datos permite que el formulario no pueda ejecutar ninguna accion, hasta que este campo sea llenado, en caso de que se ejecutara alguna accion con este campo de insersion vacio, el Required Field Validator presentaria su mensaje de error y la accion no se ejecutaria, hasta que sea llenado el campo requerido.

<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtuname" ErrorMessage="*" SetFocusOnError="True"> </asp:RequiredFieldValidator>

Regular Expressión Validator: Este control comprueba si el valor de un control de entrada coincide con el patrón definido por la expresión regular. En otras palabras nos puede funcionar como un filtro de caracteres no deseados en nuestra aplicación, además contiene ya expresiones predefinidas que podemos seleccionar como: dirección Web y correo electrónico, donde contiene la expresión de validación para estos dos formatos, pero también podemos crear nuestras propias expresiones regulares, veamos unos ejemplos:

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtuname" Display="Dynamic" ErrorMessage="Contiene Caracteres Invalidos" SetFocusOnError="True" ValidationExpression="^[A-Za-z \s]{0,40}$"> </asp:RegularExpressionValidator><br />

ValidationExpression="^[A-Za-z \s]{0,40}$"> Esta expresion nos permite crear un filtro que solo nos acepte letras del Alfabeto de A a Z, tanto mayusculas como minusculas y espacios, tambien limitando el ingreso de datos a un maximo de 40 caracteres.

ValidationExpression="^[A-Za-z1-0 \s]{0,100}$"> Ahora nos aceptara las letras del alfabeto, tambien numeros y espacios pero esta vez con un maxlength de 100 caracteres.

ValidationExpression="^[1-0\s]{0,7}$"> Ahora nos aceptara solo numeros, con un maxlength de 7 caracteres.

Con este control podemos utilizar las validaciones ya contenidas en el control o crear nuestras propias expresiones, controlando de una mejor manera los valores de los campos de inserción.

Range Validator: Este comprueba si el valor de un control se encuentra en un intervalo especificado de valores.

<asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="txtfecha"

Display="Dynamic" ErrorMessage="No se encuentra en el rango establecido" SetFocusOnError="True" Type="Date" MaximumValue="01/01/2020" MinimumValue="01/01/2000"></asp:RangeValidator></td>

En este ejemplo vemos como asignamos Date al tipo, además le pusimos un rango de fecha del 01/01/2000 al 01/01/2020, así que serán validos solo el ingreso de datos tipo fechas con un rango del 01 de enero del 2000 al 01 de enero del 2020.

Compare Validator: Este control simplemente compara el contenido de un control con otro, según los parámetros de comparación establecidos, por medio de las propiedades ControltoCompare y ControlToValidate y asignando los métodos se comparación en la propiedad Operador.

<asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="Comparacion dePasswords, Negativa" ControlToCompare="txtpwd" ControlToValidate="txtpwdval" Display="Dynamic" SetFocusOnError="True"> </asp:CompareValidator>

Bien, ya hemos visto casi todos los Validadores disponibles en el visual Studio 2005.

Ahora veremos otras formas de evitar inyección de código.

HTML-Encode: Convierte elementos HTML que utilizan caracteres HTML reservados de forma que se muestren en lugar de ejecutarse. Así nos aseguramos que cualquier entrada de datos proporcionada por el usuario se represente como texto estático en los exploradores, y no como secuencias de comandos ejecutables ni elementos HTML interpretados. Proviene del método HttpUtility.HtmlEncode.

Label1.Text = Server.HtmlEncode(TextBox1.Text)

Así por ejemplo la etiqueta <script> se convertirá en <script>

UrlEncode: Se puede utilizar para codificar una dirección URL no fiable, basada en entradas por parte del usuario, donde puede haber secuencias de comandos malintencionadas y que podrían suponer una amenaza.

HttpUtility.UrlEncode(urlstring);

Regex: Esta clase es como una expresión regular de sólo lectura. Dispone así mismo de métodos estáticos enfocados en utilizar otros tipos de expresiones regulares, sin tener que crear de manera explícita instancias de objetos de las otras clases.

Por medio de esta clase podremos obtener y comparar el valor de una cadena, buscando y filtrando caracteres que puedan generar una cadena de código dañino, su función es similar al RegularExpressionValidator a la hora de generar la validación de expresiones, pero dicha clase permite controles de expresiones regulares mas amplias y definidas.

Dim r As Regex
r = New Regex("\s200")
Dim r As New Regex("<>'=")
Dim m As Match = r.Match("txtuname")
If m.Success Then
End If
Otro ejemplo:
Function CleanInput(strIn As String) As String
Return Regex.Replace(strIn, "[^\w\.@-]", "")
End Function


Validate Request: La validación de solicitudes se encuentra habilitada de una forma predeterminada en el archivo Machine.config del servidor, pero en caso de alojar nuestros sitios en un servidor fuera de nuestro control es buena idea verificar que el Validate Request se encuentre habilitado.

<system.web>
   <pages buffer="true" validateRequest="true" />
</system.web>

Además que debemos evitar desactivarlos a menos que nos resulte muy necesario hacerlo, como por ejemplo: Si contiene un campo de entrada de texto enriquecido en formato libre diseñado para aceptar un intervalo de caracteres HTML como entrada.

Kenyie Araya Ramos

Manual