¿Se está filtrando el filtro HTML sin escapar dentro de las etiquetas pre?

2

De forma predeterminada, WordPress elimina cualquier contenido que pueda ser HTML no escapado en los comentarios de usuarios no registrados, lo que es bueno para proteger contra XSS, pero innecesariamente extiende ese filtrado a los elementos <pre> también. En mi blog, donde casi todas las publicaciones generan comentarios que se benefician de fragmentos de código HTML, ese filtrado ha causado muchos problemas frustrantes para mis usuarios (y para mí).

¿Hay una manera de "arreglar" ese filtrado excesivamente agresivo dentro de los elementos <pre> en los comentarios no registrados, sin desactivarlo por el resto del comentario? Preferiblemente, de una manera que sobreviva a las actualizaciones.

    
pregunta Dave Ward 16.08.2010 - 14:02

2 respuestas

5

una pequeña solución; Lo más destacado fue en mi blog a través de JavaScript

function pre_esc_html($content) {
  return preg_replace_callback(
    '#(<pre.*?>)(.*?)(</pre>)#imsu',
    create_function(
      '$i',
      'return $i[1].esc_html($i[2]).$i[3];'
    ),
    $content
  );
}

add_filter(
  'the_content',
  'pre_esc_html',
  9
);
    
respondido por el bueltge 16.08.2010 - 19:11
1

Aunque esto puede ser un poco más de lo que está buscando, WP-Syntax deshabilita el filtrado de HTML dentro de <pre> etiquetas dentro de publicaciones y comentarios (AFAIK). También funciona para Wordpress 3.0, aunque el sitio web dice que solo funciona con 2.8.

Si desea simplificarlo, sugiero buscar en wp-syntax.php dentro del complemento (específicamente en la parte inferior donde usan add_filters() para ver cómo deshabilitan el filtrado de HTML automático de Wordpress dentro de las etiquetas <pre> ). A continuación, puede aplicar eso a los comentarios.

EDITAR: he mirado el archivo y usan regex y preg_replace_callback() de PHP para conservar el HTML original dentro de <pre> etiquetas Puede que tenga que modificarlo para que se ajuste a sus necesidades.

Tendría, por ejemplo (nota: código no probado):

<?php
// Unique string for placeholder
$custom_token = md5(uniqid(rand()));

// Store all the matches in an array
$custom_matches = array();

function custom_substitute(&$match) {
    global $custom_token, $custom_matches;

    $i = count($custom_matches);

    // Store the match for later use
    $custom_matches[$i] = $match;

    // Unique placeholder so that we know where to put the code that was ripped out
    return '<p>' . $custom_token . '</p>';
}

function custom_replace($match) {
    global $custom_matches;

    $i = intval($match[1]);
    $match = $custom_matches[$i];

    // The index might be off - you might want to double-check it
    return htmlentities($match[1]);
}

function custom_before_content_filter($content) {
    return preg_replace_callback("/\s*<pre+>(.*)<\/pre>\s*/siU", 'custom_substitute', $content);
}

function custom_after_content_filter($content) {
    global $custom_token;

    return preg_replace_callback("/<p>\s*" . $custom_token . "\s*<\/p>/si", 'custom_replace', $content);
}
// Run the "before" filter first, with priority of 0
add_filter('comment_text', 'custom_before_content_filter', 0);

// Now run the "after" filter
add_filter('comment_text', 'custom_after_content_filter', 99);
    
respondido por el john010117 16.08.2010 - 17:53

Lea otras preguntas en las etiquetas