Cómo evitar los problemas de seguridad relacionados con las secuencias de comandos entre sitios

Seleccione idioma Seleccione idioma
Id. de artículo: 252985 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Las páginas HTML generadas dinámicamente pueden implicar riesgos de seguridad si los datos no se validan al entrar o al salir. Se pueden incrustar secuencias de comandos malintencionadas en los datos que se envían a las páginas Web y, en los exploradores, tendrán la misma apariencia que tendrían si proviniesen de una fuente de confianza. Este problema se conoce como problema de seguridad relacionado con las secuencias de comandos entre sitios. En este artículo se describen los problemas de seguridad relacionados con las secuencias de comandos entre sitios, así como sus ramificaciones y su prevención.

Más información

Problema

El problema subyacente es que muchas páginas Web muestran datos que no están validados. En tal caso, se pueden incrustar secuencias de comandos malintencionadas en los propios datos. Si una secuencia de comandos de servidor muestra estos datos no validados, la secuencia se ejecuta en el explorador como si la hubiera generado el sitio de confianza.

Ramificaciones

Si no están validados los datos de las páginas Web dinámicas, pueden producirse los siguientes problemas:
  • La integridad de los datos puede verse comprometida.
  • Se pueden establecer y leer cookies.
  • Se pueden interceptar los datos de entrada del usuario.
  • El cliente puede ejecutar secuencias de comandos malintencionadas dentro del contexto del origen de confianza.
¿Cuáles son las páginas Web que corren riesgo? Básicamente, el problema afecta a la creación de páginas dinámicas basadas en datos que no están validados. Entre los ejemplos típicos se incluyen los siguientes tipos de páginas Web:
  • Motores de búsqueda que devuelven páginas de resultados basadas en datos especificados por el usuario.
  • Páginas de inicio de sesión que almacenan cuentas de usuario en bases de datos, cookies, etc. y que después muestran el nombre del usuario en el cliente.
  • Formularios Web Forms que procesan información de tarjetas de crédito.

Prevención

En esta sección se describen algunos enfoques para evitar ataques de seguridad relacionados con las secuencias de comandos entre sitios. Estudie su situación específica para determinar las técnicas que funcionarán mejor en su caso. Es importante destacar que, en todas las técnicas, está validando información que recibe de datos de entrada y no de sus secuencias de comandos de confianza. Básicamente, la prevención implica seguir buenas prácticas de codificación ejecutando comprobaciones de validez en los datos y en las rutinas de entrada.

La lista siguiente incluye los enfoques generales para evitar ataques relacionados con las secuencias de comandos entre sitios:
  • Codificar los datos de salida basados en parámetros de entrada.
  • Filtrar los parámetros de entrada por caracteres especiales.
  • Filtrar los datos de salida basados en parámetros de entrada por caracteres especiales.
Al filtrar o codificar, debe especificar un conjunto de caracteres para las páginas Web con el fin de asegurarse de que el filtro busca los caracteres especiales adecuados. Los datos que se insertan en las páginas Web deben filtrar secuencias de bytes que se consideran especiales basándose en el conjunto de caracteres específico. Un juego de caracteres normal es el que se ajusta a ISO 8859-1, que era el conjunto predeterminado en versiones anteriores de HTML y HTTP. Debe tener en cuenta los problemas de localización de cuentas cuando cambie estos parámetros.

Codificar los datos de salida basados en parámetros de entrada para caracteres especiales

Codifique los datos que recibe como datos de entrada cuando los registre como HTML. Esta técnica es efectiva con datos que no se validaron por algún motivo durante la entrada. Mediante el uso de técnicas como URLEncode y HTMLEncode, puede evitar que se ejecuten secuencias de comandos malintencionadas.

Los siguientes fragmentos de código muestran cómo utilizar URLEncode y HTMLEncode desde páginas Active Server (ASP):
<%
      var BaseURL = http://www.mysite.com/search2.asp?searchagain=;
      Response.write("<a href=\"" + BaseUrl +
      Server.URLEncode(Request.QueryString("SearchString")) +
      "\">click-me</a>");
%>
<% Response.Write("Hello visitor <I>" +
      Server.HTMLEncode(Request.Form("UserName")) +
      "</I>");
%>
				
Si codifica las páginas HTML y las direcciones URL, quizás deba especificar la página de códigos tal y como lo haría si fuese a filtrar datos.

Es importante destacar que si se llama a HTMLEncode en la cadena que está a punto de mostrarse, se evitará que se ejecuten las secuencias de comandos que contenga y, de esta forma, el problema.

Filtrar los parámetros de entrada por caracteres especiales

El filtrado de datos de entrada quita parte de los caracteres especiales o todos ellos de los datos de entrada. Los caracteres especiales son caracteres que permiten la generación de secuencias de comandos en una secuencia HTML. Entre los caracteres especiales se incluyen los siguientes:
< > " ' % ; ) ( & + -
				
Tenga en cuenta que su situación individual puede garantizar el filtrado de caracteres o cadenas adicionales más allá de los caracteres especiales.

Aunque el filtrado puede ser una técnica efectiva, existen unas pocas salvedades:
  • El filtrado puede no ser adecuado para algunos datos de entrada. Por ejemplo, en aquellos casos en los que se reciben datos de entrada tipo <TEXT> de un formulario HTML, puede que desee elegir un método como la codificación (consulte la información que se encuentra más abajo).
  • Algunos caracteres filtrados pueden ser datos de entrada requeridos para la secuencia de comandos del servidor.
El siguiente filtro de ejemplo, que está escrito en JavaScript, muestra cómo se quitan los caracteres especiales:
function RemoveBad(strTemp) { strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,""); return strTemp; } 
				
El código siguiente procesa datos de entrada del usuario antes de almacenarlos para su uso posterior.
<% Session("StoredPreference") = RemoveBad(Request.Cookies("UserColor"));
         var TempStr = RemoveBad(Request.QueryString("UserName"));
%>
				

Filtrar los datos de salida basados en parámetros de entrada por caracteres especiales

Esta técnica es similar al filtrado de datos de entrada salvo que se filtran los caracteres registrados en el cliente. Aunque puede ser una técnica efectiva, quizá represente un problema para las páginas Web que registran elementos HTML.

Por ejemplo, en una página que registra elementos <TABLE>, una función genérica que quite los caracteres especiales eliminaría los caracteres <and>, lo que estropearía la etiqueta <TABLE>. Por consiguiente, para que esta técnica sea útil, sólo debería filtrar datos transferidos o datos introducidos previamente por un usuario y almacenados en una base de datos.

Posibles orígenes de datos malintencionados

Aunque el problema es aplicable a cualquier página que utilice datos de entrada en HTML generado dinámicamente, a continuación se describen algunos posibles orígenes de datos malintencionados con el fin de ayudar al usuario a detectar riesgos potenciales de seguridad:
  • Cadena de consulta
  • Cookies
  • Datos publicados
  • Direcciones URL y partes de direcciones URL, como PATH_INFO
  • Datos recuperados de los usuarios que se mantienen de alguna forma como en una base de datos

Conclusión

Para concluir, a continuación se citan los puntos clave que hay que recordar respecto al problema de seguridad relacionado con las secuencias de comandos entre sitios:
  • El problema afecta a la creación de páginas dinámicas basadas en datos de entrada que no están validados.
  • La omisión de una comprobación de validez de los datos de entrada puede tener implicaciones de seguridad inesperadas. El problema puede evitarse mediante estándares de desarrollo eficaces como la validación de los datos de entrada.
  • Debe evaluar las soluciones basándose en el sitio, la página e incluso en el campo y utilizar la técnica más adecuada.

Referencias

Para obtener más información, consulte el Advisory de Computer Emergency Response Team (CERT) de Carnegie Mellon University en el siguiente sitio Web:
http://www.cert.org/advisories/CA-2000-02.html
Para obtener más información al respecto, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
253117 Evitar en Internet Explorer y Outlook Express los problemas de seguridad relacionados con las secuencias de comandos entre sitios
253119 Cómo revisar en el código ASP la vulnerabilidad de CSSI
253120 Cómo revisar en el código generado por Visual InterDev la vulnerabilidad de CSSI
253121 Cómo revisar en el código MTS/ASP la vulnerabilidad de CSSI

Propiedades

Id. de artículo: 252985 - Última revisión: viernes, 7 de abril de 2006 - Versión: 3.3
La información de este artículo se refiere a:
  • Microsoft Active Server Pages 2.0
  • Microsoft Active Server Pages 3.0
  • Microsoft Windows 2000 Server
Palabras clave: 
kbcodesnippet kbcssi kbhowto kbsecurity KB252985

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com