Pregunta

¿Existe una implementación PHP de Markdown adecuada para usar en comentarios públicos?

Básicamente, solo debería permitir un subconjunto de la sintaxis de rebajas (negrita, cursiva, enlaces, comillas en bloque, bloques de código y listas) y eliminar todo el HTML en línea (¿o posiblemente escapar de él?)

Supongo que una opción es utilizar el analizador de rebajas normal y ejecutar el resultado a través de un desinfectante HTML, pero ¿existe una mejor manera de hacerlo?

Estamos usando PHP Markdown Extra para el resto del sitio, por lo que ya tendríamos que usar un analizador secundario (la versión que no es "Extra", ya que cosas como la compatibilidad con notas al pie son innecesarias).También parece mejor analizar sólo el *bold* texto y tener todo escapado a &lt;a href="etc"&gt;, que generar <b>bold</b> texto y tratando de quitar los bits que no queremos..

Además, en una nota relacionada, estamos usando el control de armas de destrucción masiva para el sitio "principal", pero para los comentarios, ¿qué otras opciones hay?La vista previa de JavaScript de WMD es buena, pero necesitaría la misma "castración" que el procesador de rebajas de PHP (no puede mostrar imágenes, etc.; de lo contrario, alguien las enviará y su rebajas de trabajo se "romperá")

Actualmente, mi plan es usar PHP-markdown -> método HTML santiser y editar WMD para eliminar la sintaxis de imagen/encabezado de showdown.js - pero parece que esto se ha hecho innumerables veces antes...

Básicamente:

  • ¿Existe una implementación de rebajas "segura" en PHP?
  • ¿Existe un editor de rebajas de HTML/javascript que pueda desactivar fácilmente las mismas opciones?

Actualizar: Terminé simplemente ejecutando el markdown() salida a través de Purificador HTML.

De esta manera, el renderizado de Markdown estaba separado del saneamiento de salida, que es mucho más simple (dos bases de código en su mayoría sin modificar), más seguro (no estás intentando hacer tanto el renderizado como el saneamiento a la vez) y más flexible (puedes tener múltiples saneamientos). niveles, digamos una configuración más laxa para contenido confiable y una versión mucho más estricta para comentarios públicos)

¿Fue útil?

Solución

PHP Markdown tiene una opción de desinfección, pero no parece anunciarse en ninguna parte.Echa un vistazo a la parte superior del Markdown_Parser clase en markdown.php (comienza en la línea 191 en la versión 1.0.1m).Nos interesan las líneas 209-211:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

Si los cambias a true, el marcado y las entidades, respectivamente, deben tener caracteres de escape en lugar de insertarse palabra por palabra.No parece haber ninguna forma integrada de cambiarlos (por ejemplo, a través del constructor), pero siempre puedes agregar una:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

Tenga en cuenta que la función anterior crea un nuevo analizador en cada ejecución en lugar de almacenarlo en caché como el proporcionado Markdown La función (líneas 43-56) sí lo hace, por lo que podría ser un poco lento.

Otros consejos

JavaScript Editor de rebajas Hipótesis:

  • Use un JavaScript impulsada por el Editor de rebajas, por ejemplo, sobre la base de enfrentamiento
  • Eliminar todos los iconos y las pistas visuales de la barra de herramientas de elementos no deseados
  • Establecer un filtro de JavaScript a la limpieza de marcado no deseado en la presentación
  • Prueba y endurecer todos los cambios de JavaScript y filtros localmente en el equipo
  • Espejo esos filtros en el script PHP presentación, para ponerse al mismo en el lado del servidor.
  • Eliminar todas las referencias a elementos no deseados de Ayuda / Tutoriales

He creado un editor de rebajas en JavaScript, pero tiene características mejoradas. Que tuvo una gran parte del tiempo y las revisiones SVN. Pero no creo que sería tan difícil de alterar un editor de rebajas para limitar el código HTML permitido.

Si usted está buscando para escribir su propio analizador, por qué no utilizar la arquitectura de BBCode.

Al presentar su / (usuario) comenta que necesita para desinfectar el texto con mysql_escape_real_string (), sí hay otras funciones, pero esto detendrá cualquier Inyecciones JS.

¿Qué hay de funcionamiento htmlspecialchars en el usuario introduce de entrada, antes de procesarlo a través de rebajas? Debe escapar nada peligroso, pero deje todo lo que entiende de rebajas.

Estoy tratando de pensar en un caso en el que esto no funcionaría, pero no se me ocurre nada fuera de la mano.

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