Como todos sabemos por ahora, los ataques XSS son peligrosos y realmente fáciles de llevar a cabo . Varios marcos facilitan la codificación de HTML, como lo hace ASP.NET MVC:
<%= Html.Encode("string"); %>
Pero, ¿qué sucede cuando su cliente requiere que pueda cargar su contenido directamente desde un documento de Microsoft Word?
Este es el escenario: las personas pueden copiar y pegar contenido de Microsoft Word en un editor WYSIWYG (en este caso, tinyMCE ), y luego esa información se publica en una página web.
El sitio web es público, pero solo los miembros de esa organización tendrán acceso para publicar información en una página web.
¿Cómo manejo estos requisitos de manera segura? Actualmente no se realiza ninguna comprobación sobre lo que publica el cliente (ya que solo los usuarios 'confiables' pueden publicar), pero no estoy particularmente contento con eso y me gustaría bloquearlo aún más en caso de que se piratee una cuenta.
El único método conceptual que conozco que cumple con estos requisitos es incluir en la lista blanca las etiquetas HTML y dejarlas pasar . ¿Hay otra manera? Si no es así, ¿cuál es una forma segura de permitir que el usuario almacene la entrada en la base de datos en cualquier forma, pero solo la muestre correctamente codificada y sin etiquetas malas?
Pregunta relacionada
Prevención de secuencias de comandos de sitios cruzados (XSS)
fuente
Respuestas:
La forma más fácil (para usted como desarrollador) es probablemente implementar una de las muchas variaciones de Markdown , por ejemplo Markdown.NET o, aún mejor (en mi opinión), un editor de wmd .
Luego, sus usuarios podrían pegar HTML simple, pero nada peligroso, y podrían obtener una vista previa de sus datos ingresados y corregir cualquier escrúpulo incluso antes de publicar ...
fuente
La inclusión en la lista blanca es, de hecho, la mejor manera de prevenir ataques XSS cuando se permite a los usuarios ingresar HTML, ya sea directamente o usando un editor de texto enriquecido.
Sobre sus otras preguntas:
No creo que esto pueda funcionar. Necesita código del lado del servidor para esto y el RTE se ejecuta en el cliente.
TinyMCE filtra las etiquetas si lo desea, pero dado que esto tiene lugar en el navegador, no puede confiar en él. Ver extendidos_elementos_válidos . TinyMCE (Moxie) también sugiere una lista blanca, ver aquí .
Siempre debe filtrar HTML a menos que existan razones específicas para no hacerlo (muy raro). Algunas razones: a) la funcionalidad que es para usuarios internos hoy, tal vez para el público de mañana b) el acceso no autorizado tendrá menos impacto
Así es como lo prefiero. No me gusta cambiar la entrada del usuario antes de insertarlo en la base de datos por varias razones.
fuente
Estoy haciendo lo mismo Estoy usando TinyMCE y estoy permitiendo pegar documentos de Word. Solo ciertas personas que mantienen el sitio pueden hacerlo a través de un área de administración. Esto está asegurado por la Membresía ASP.Net. Simplemente hago HTML.Encode cuando se envía al sitio público.
Puede usar el código a continuación si lo desea antes de que se coloque en la base de datos, pero no está seguro de qué efecto le afectaría. Puede que tenga que ir con su lista blanca.
fuente
Una opción podría ser el Control de edición de HTML para .NET (que escribí).
Es un editor HTML WYSIWYM para .NET, que solo admite un subconjunto de los elementos HTML , excluyendo los
<script>
elementos: de esta manera, actúa como una lista blanca.Si es para uso interno (es decir, un sitio de intranet), el control puede integrarse en una página web .
No he integrado el soporte para pegar desde Word, pero tengo un componente que es un paso en esa dirección: un convertidor de Doc a HTML ; entonces tengo los bloques de construcción que podrías usar en ASP.NET para convertir un Doc a HTML, mostrar el HTML en el editor, etc.
fuente
Mi IMHO sigue confiando en sus usuarios hasta que se haga público.
Bueno, no hay una forma confiable de satisfacer sus necesidades. Por ejemplo, cualquier editor WYSIWYG no protege el formulario al insertar imágenes con URL (seguimiento de uso indirecto, contenido ilegal) o texto (texto ilegal, texto mal escrito, texto perdido).
Mi punto de vista es que si puede confiar en sus usuarios, simplemente permita todo, solo advierta a los usuarios si hay SABER marcas peligrosas (para evitar errores).
Si no confía, use una especie de marcado especial (por ejemplo, Markdown).
En mi proyecto utilizamos tipos especiales para contenido potencialmente peligroso y métodos especiales para representar y aceptar dicho contenido. Este código tiene una alta calificación en nuestro modelo de subprocesos y la atención es muy alta (por ejemplo, cada cambio debe ser revisado por dos codificadores independientes, tenemos un conjunto completo de pruebas, etc.).
fuente