it-swarm-es.com

¿Se está relajando el filtrado HTML sin escapar dentro de las etiquetas <pre>?

De forma predeterminada, WordPress elimina cualquier contenido que pueda ser HTML no guardado en los comentarios de los usuarios no registrados, lo que es bueno para proteger contra XSS, pero también amplía innecesariamente ese filtrado a elementos <pre>. 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 a mis usuarios (y a mí mismo).

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

2
Dave Ward

una pequeña solución; Lo más destacado fue en mi blog vía 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
);
5
bueltge

Aunque esto puede ser un poco más de lo que está buscando, WP-Syntax deshabilita el filtrado de HTML dentro de las etiquetas <pre> dentro de las publicaciones y comentarios (AFAIK). También funciona para Wordpress 3.0, aunque el sitio web dice que funciona solo 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>). Luego puede aplicar eso a los comentarios.

EDITAR: He mirado el archivo, y usan expresiones regulares y PHP preg_replace_callback() para conservar el HTML original dentro de las etiquetas <pre>. Es posible que tengas que modificarlo para que se ajuste a tus 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);
1
john010117