script injection generic for examples code attack php security user-input markdown

injection - php filter attack



Procesador de descuento "seguro" para PHP (4)

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

Básicamente, solo debe permitir un subconjunto de la sintaxis de rebajas (en negrita, cursiva, enlaces, comillas de 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 usar el analizador sintáctico normal y ejecutar el resultado a través de un desinfectante HTML, pero ¿hay una forma mejor de hacerlo?

Estamos utilizando PHP markdown Extra para el resto del sitio, por lo que ya tendríamos que usar un analizador secundario (la versión no "Extra", ya que no es necesario el soporte de notas al pie). También parece un análisis más agradable solamente el texto *bold* y todo tiene escapado a &lt;a href="etc"&gt; , que generar texto <b>bold</b> y tratar de quitar los bits que no queremos ...

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

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

Básicamente:

  • ¿Hay una implementación de rebajas "segura" en PHP?
  • ¿Hay un editor de marcas HTML / javascript que podría tener las mismas opciones fácilmente deshabilitadas?

Actualización: terminé simplemente ejecutando el resultado de markdown() través de HTML Purifier .

De esta forma, la representación de Markdown fue separada de la sanitización de salida, que es mucho más simple (dos bases de códigos mayormente no modificadas) más segura (no intenta hacer renderizado y desinfección de una vez) y más flexible (puede tener múltiples desinfectantes) niveles, por ejemplo, una configuración más laxa para contenido confiable y una versión mucho más estricta para comentarios públicos)


¿Qué tal si ejecuta htmlspecialchars en la entrada ingresada por el usuario, antes de procesarla mediante el descuento? Debería escapar a cualquier cosa peligrosa, pero dejar todo lo que ese descuento comprende.

Estoy tratando de pensar en un caso en el que esto no funcionaría, pero no puedo pensar en nada.


JavaScript Markdown Editor Hipótesis:

  • Use un Editor de marcado impulsado por JavaScript, por ejemplo, basado en el enfrentamiento
  • Elimine todos los iconos y pistas visuales de la barra de herramientas para los elementos no deseados
  • Configure un filtro de JavaScript para limpiar el marcado no deseado en el envío
  • Pruebe y endurezca todos los cambios y filtros de JavaScript localmente en su computadora
  • Refleja esos filtros en la secuencia de comandos de envío de PHP para capturarlos en el lado del servidor.
  • Elimine todas las referencias a elementos no deseados de Ayuda / Tutoriales

Creé un editor de Markdown en JavaScript, pero tiene funciones mejoradas. Eso tomó una gran parte del tiempo y las revisiones de SVN. Pero no creo que sea tan difícil modificar un editor de Markdown para limitar el HTML permitido.


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

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

Si los cambia a true , el marcado y las entidades, respectivamente, deberían escaparse en lugar de insertarse textualmente. No parece haber una forma incorporada de cambiarlos (por ejemplo, a través del constructor), pero siempre puedes agregar uno:

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 lo hace la función de Marcado proporcionada (líneas 43-56), por lo que podría estar un poco lento.


Si está buscando escribir su propio analizador, ¿por qué no utilizar la arquitectura BBCode?

Al enviar sus comentarios / (usuario) necesita desinfectar el texto con mysql_escape_real_string (), sí hay otras funciones, pero esto detendrá las inyecciones de JS.