2010-01-13 16 views
7

Tengo un editor que permite a los usuarios agregar HTML que se almacena en la base de datos y se representa en una página web. Como esta es una entrada que no es de confianza, planeo usar Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment para desinfectar el HTML.Sanitize HTML antes de almacenar en la base de datos o antes de la representación? (Biblioteca AntiXSS en ASP.NET)

  • ¿Debo santificarme antes de guardar en la base de datos o antes de presentar la entrada no confiable en la página web?
  • ¿Existe una ventaja al incluir el código fuente AntiXSS en mi proyecto en lugar de solo la DLL? (Tal vez pueda personalizar la lista blanca?)
  • ¿Qué archivo de clase debo buscar en para la implementación real de la GetSafeHtmlFragment

Respuesta

28

no estoy de acuerdo con la respuesta seleccionada por dos razones

  1. Si almacenó los datos codificados, usted tiene que escoger un codificador antes de almacenar. ¿Qué sucede si ha almacenado algo como HTML pero también desea extraerlo en otro formato, por ejemplo, como respuesta JSON, o como parte de un documento XML? Ahora tiene un formato codificado en HTML que debe decodificar, luego codificar en el formato correcto.
  2. ¿Qué sucede si descubrimos un error en los codificadores y sacamos una nueva versión? Ahora, como no está codificando en el punto de salida, todos sus datos anteriores pueden contener elementos que se han codificado incorrectamente. Puedes codificar de nuevo, pero luego tocas problemas de codificación doble que pueden ser dolorosos para filtrar correctamente.

Generalmente codifica en el punto de salida y trata los datos provenientes de un almacén de datos como no confiables por defecto, después de todo, ¿qué pasa si alguien logra editar su base de datos directamente o mediante inyección SQL?

+1

Volví y te voté porque estoy de acuerdo con sus argumentos y su sugerencia coincide con la recomendación de OWASP. Con suerte, @ user102533 cambiará y aceptará la tuya. – David

+1

No está almacenando datos codificados, está almacenando datos desinfectados - gran diferencia (todavía no está codificado en HTML) – orip

+0

El punto 2 sigue en pie (¡y sí, no presté suficiente atención al leer!) ¿Qué pasa si hay un error en el desinfectante? ¿O quieres cambiar las reglas de sanitzation? – blowdart

3
  • Tanto
  • Sólo si piensa cambiar, lo que no lo haría hacer personalmente
  • la clase AntiXSS (ya que es llamado como AntiXss.GetSafeHtmlFragment())
+0

Ya hay un código HTML en la base de datos; si lo desinfecto antes de agregarlo a la base de datos, entonces debo desinfectar los datos que ya existen (por coherencia). Pero, ¿hay algún valor en desinfectar antes de agregarlo a la base de datos? – Nick

+0

Para mí, el valor principal es que puede ser un novato el que cree la próxima aplicación web que lea de su base de datos.Nunca se sabe quién se hará cargo una vez que haya pasado a pastos más verdes. Además, es bueno tener el hábito de hacerlo así que es una segunda naturaleza. – David

+0

+1 para desinfectar todo el tiempo, por las dudas. Lo único que se debe tener en cuenta es un posible golpe de rendimiento, en cuyo caso puede desinfectarse simplemente guardando en la base de datos, pero luego debe tener cuidado de que toda la información en la base de datos esté realmente desinfectada. – orip

-1

Usted puede usar la directiva de página en el parámetro ValidateRequest = "true". De esta forma, todos los datos de Solicitud se validan y, si hay un problema de validación, siempre se puede detectar el error. También evita los hilos de inyección sql y otros no solo XSS posibles.

con datos numéricos, puede validar desbordamiento de enteros o mal uso de tipos de datos con Int32.TryParse() o cualquier otro de la familia TryParse (Byte.TryParse Int16.TryParse ...)

No hay necesidad de usar cualquier otra clase o método adicional de desinfección.

+0

La validación de solicitud está activada de manera predeterminada, pero usted está confiando demasiado en ella. Debe tratarlo como una capa de seguridad que se complementa con la validación de la lista blanca en el punto de entrada (de alguna manera se tocó en este caso el análisis interno) y la codificación de salida. Tampoco hará mucho por ti en términos de inyección de SQL; la declaración "'o 1 = 1" irá directo. Esto podría ayudar a explicarlo un poco mejor: http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html –

8

Escuche el OWASP podcast 67 with Jeff Williams on XSS. Habla sobre no desinfectar o codificar antes del almacenamiento. La razón principal es que si las bibliotecas (cuando) evolucionan en respuesta a nuevas vulnerabilidades, sus datos van a quedar atrapados en la versión anterior. Por supuesto, esto no le impide ejecutar ninguna entrada en una lista blanca en el punto de entrada y rechazar cualquier cosa fuera del rango aceptable.

Cuestiones relacionadas