it-swarm-pt.tech

Relaxando o filtro HTML sem escapar dentro de <pre> tags?

Por padrão, o WordPress remove qualquer conteúdo que possa ser HTML sem escape nos comentários de usuários não registrados, o que é bom para proteger contra XSS, mas também estende desnecessariamente essa filtragem para os elementos <pre>. No meu blog, onde quase todas as postagens geram comentários que se beneficiam de trechos de código HTML, essa filtragem fez com que meus usuários (e eu) fizessem muitos problemas frustrantes.

Existe uma maneira de "consertar" essa filtragem excessivamente agressiva dentro de elementos <pre> dentro de comentários não registrados, sem desabilitá-la para o resto do comentário? De preferência, de uma forma que sobrevive às melhorias.

2
Dave Ward

uma pequena solução; o destaque foi no meu blog via 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

Embora isso possa ser um pouco mais do que você está procurando, a Sintaxe do WP desabilita a filtragem de HTML dentro de tags <pre> dentro de postagens e comentários (AFAIK). Ele também funciona para o Wordpress 3.0, embora o site diga que funciona apenas com o 2.8.

Se você quiser simplificar, sugiro procurar em wp-syntax.php no plug-in (especificamente na parte inferior onde eles usam add_filters() para ver como eles desativam a filtragem automática de HTML do Wordpress nas tags <pre>. Você pode aplicar isso aos comentários.

EDIT: Eu olhei para o arquivo, e eles usam regex e PHP preg_replace_callback() para preservar o HTML original dentro de tags <pre>. Você pode ter que modificá-lo para atender às suas necessidades.

Você teria, por exemplo (nota: código não testado):

<?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