Pregunta

Cuando está desarrollando una aplicación basada en la web y desea permitir el texto con formato enriquecido del usuario, debe elegir cómo permitir esa entrada. Se han creado muchos lenguajes de marcado diferentes porque podría decirse que es más difícil desinfectar HTML.

¿Cuáles son las ventajas y desventajas de los diferentes lenguajes de marcado como:

O, para decirlo de otra manera, ¿qué factores considera al elegir usar un lenguaje de marcado particular?

¿Fue útil?

Solución

Markdown, BBCode, Textile, MediaWiki markup son básicamente el mismo concepto general, por lo que realmente lo agruparía en dos categorías: HTML y marcado de texto sin formato.

HTML

El trato con HTML es que el contenido ya está en un " presentable " formulario para contenido web. Eso es genial, ahorra tiempo de procesamiento y es un lenguaje fácilmente analizable. Hay docenas de bibliotecas en casi cualquier idioma para manejar el contenido HTML, convertir a / de HTML a otros formatos, etc. No siempre depende de una entrada sensata al aceptar HTML de los usuarios. Como se señaló, ordenar o santificar HTML a menudo es muy difícil, especialmente porque no sigue las reglas de marcado normales de la forma en que lo hace XML (es decir, las etiquetas cerradas incorrectamente son comunes).

Marcado de texto sin formato

Esta categoría se usa con frecuencia por los siguientes motivos:

  • Fácil de analizar en múltiples formas desde una sola fuente: PDF, HTML, RTF
  • El contenido se almacena en texto plano legible (generalmente mucho más fácil de leer que HTML sin formato) si es necesario en una fecha posterior, en lugar de necesitar extraerlo del HTML
  • Sigue reglas definidas específicas donde HTML puede ser una variable molesta y no estructurada
  • Le permite forzar un subconjunto de formato de contenido que es más apropiado en muchos casos que simplemente permitir HTML completo
  • Además de forzar un subconjunto de HTML, facilita la desinfección de la entrada y evita problemas de secuencias de comandos entre sitios, etc.
  • Mantener " raw " los datos en un formato abstracto significa que en una fecha posterior, si por ejemplo desea convertir su sitio de HTML 4 a XHTML, solo necesita cambiar el código de análisis. Con la entrada de usuario con formato HTML, ahora está atascado y tiene que convertir todo el HTML a XHTML individualmente, lo que, como muestra HTML Tidy, no siempre es una tarea simple. Del mismo modo, si aparece un nuevo lenguaje de marcado en algún momento o si necesita pasar a un formato alternativo (RTF, PDF, TeX), un subconjunto restringido abstracto de opciones de formato de texto hace que sea una tarea mucho más simple.

La línea de fondo es para qué se usa la entrada del usuario. Si planea mantener los datos y puede que necesite mezclar formatos, etc., entonces tiene sentido usar un formato abstracto cuidadoso para almacenar la información. Si necesita trabajar con los datos sin procesar manualmente por cualquier motivo, entonces los puntos de bonificación si ese formato es fácilmente legible para los humanos. Si solo muestra el contenido en una página web (o un documento HTML para un informe, etc.) y no le preocupa la conversión o el futuro, entonces es una práctica razonable almacenarlo en HTML.

Otros consejos

Jeff discutió algunos pros y contras en codinghorror.com mientras estaban en las etapas iniciales de armar SO. Pensé que era una lectura que valía la pena.

@netrox la base de datos no es el problema, la salida del navegador sí.

La única preocupación es el renderizado final que puede ser roto por el HTML insertado por el usuario. Por ejemplo, el usuario podría abrir una etiqueta <li> pero nunca cerrarla, lo que dependiendo de cómo esté estructurada la página, podría potencialmente romper todo el diseño que sigue. O en otro ejemplo, abra una etiqueta <strong> sin cerrarla, poniendo todo el contenido restante en negrita.

Entonces, no solo las etiquetas permitidas deben ser validadas, sino ¿cómo permite exactamente algunas etiquetas pero no las otras? Porque es muy fácil evitar el análisis de todas las etiquetas HTML usando htmlspecialchars() PHP método, por ejemplo, pero cuando se trata de permitir algunas de las etiquetas, tendrá que buscar otras formas. Existe la strip_tags() función PHP que elimina (elimina por completo) las etiquetas no permitidas, pero eso significa alterar el contenido del usuario de manera incorrecta, evitando que el usuario publique código simple, por ejemplo (código para compartir / mostrar, no código para procesar).

Además de romper el diseño, debe considerar los ataques XSS, como insertar javascript en el atributo href de un enlace, que por ejemplo podría redirigir a los usuarios a otro sitio. Vea esta larga lista de posibles ataques XSS: https://www.owasp.org/index.php/ XSS_Filter_Evasion_Cheat_Sheet

Como puede ver, evitar que se interpreten todas las etiquetas HTML es muy fácil, pero prevenir solo algunas de las etiquetas es mucho más complicado. Para entender eso, puede echar un vistazo al enorme & Quot; Purificador HTML " framework cuyo único propósito es permitir algunas etiquetas HTML y asegurarse de que el HTML generado sea válido (es decir, no rompa la página) y esté libre de ataques XSS.

" Se han creado muchos lenguajes de marcado diferentes porque podría decirse que es más difícil desinfectar HTML. "

¿En serio? Como es dificil Hay funciones para eliminar atributos o etiquetas potencialmente peligrosas y validar el HTML antes de ingresarlo en la base de datos o archivo. ¿Me puede dar ejemplos de cómo es difícil desinfectar HTML?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top