¿Qué haces cuando un cliente requiere edición de texto enriquecido en su sitio web?

18

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)

George Stocker
fuente
Buena pregunta
aunque
Convenido. Es similar, pero es una pregunta confusa (la pregunta es difícil de encontrar), y no pregunta específicamente si hay otra forma. Si hay otra forma de renderizar HTML sin tener que incluir en la lista blanca, estoy al tanto. Si hay un motor de vista ASP.NET MVC que se encarga de esto, también es bueno saberlo.
George Stocker
En una nota no relacionada con la seguridad, el filtrado de etiquetas probablemente será útil desde la perspectiva de la interfaz de usuario. Es muy fácil escribir accidentalmente un soporte angular y olvidarse de escapar. Como estamos hablando de usuarios que están copiando desde Word, es una buena idea capturar lo que parecen etiquetas malas y codificarlas adecuadamente (es decir, & amp; lt;) para que las cosas simplemente funcionen.
Con respecto al punto # 4: ¡Apuesto a que sigue siendo un problema! La mayoría de los hacks son un trabajo interno, después de todo. Para un editor específico, he tenido buena suerte con FreeTextBox, pero no puedo hablar de qué tan bien se ajusta a sus requisitos, especialmente MVC.
Joel Coehoorn el
1
@gnat Gracias; editado Parece que mi pregunta ha llamado la atención de algún tipo de camarilla; tres votos negativos en rápida sucesión y su solicitud de protección y edición.
George Stocker

Respuestas:

8

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 ...

Tomás Aschan
fuente
Creo que StackOverflow usa un editor personalizado sin la necesidad de sintaxis de ADM
Jon
¿Qué quieres decir con sintaxis de ADM? Por lo que puedo decir, toda la sintaxis de WMD funciona. Y todavía no he encontrado nada que no funcione ...
2
El problema con el uso de Markdown es que Markdown permite HTML arbitrario; así que por sí solo no es una solución.
George Stocker
7

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:

¿Existe un editor WYSIWYG que incluye la capacidad de incluir en la lista blanca sobre la marcha?

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í .

¿Debería preocuparme por esto ya que solo será para 'publicaciones privadas'

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

¿Cuál es la mejor manera de dejar que lo almacenen en la base de datos de cualquier forma, pero solo mostrarlo correctamente codificado y despojado de etiquetas malas?

Así es como lo prefiero. No me gusta cambiar la entrada del usuario antes de insertarlo en la base de datos por varias razones.

daremon
fuente
-1

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.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }
Jon
fuente
Si almacenan texto como <script> alert ("hey") </script> y usted hace Html.Encode (<script> alert ("hey") </script>) simplemente imprimirá eso en la página y no ejecutará alerta
Jon
No estoy usando una lista blanca, solo la estoy almacenando como está. La función anterior podría ayudar, pero no sé qué efecto tendrá. Me gustaría saber qué decides. ¿Por qué mi publicación está marcada como negativa?
Jon
1
Supongo que es porque la forma en que lo hace su software es una implementación muy ingenua; Hay todo tipo de trucos que evitarán su implementación.
George Stocker
44
Una lista blanca es una buena idea, pero su método ciertamente no lo es. Regex no es una forma confiable de detectar etiquetas en el texto, ya que HTML puede ofuscarse bastante. Mucho mejor usar una biblioteca como el HTML Agility Pack.
Noldorin el
-1

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.

ChrisW
fuente
-2

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.).

Mike Chaliy
fuente