it-swarm-fr.com

Relaxation du filtrage HTML non échappé à l’intérieur des balises <pre>?

Par défaut, WordPress supprime tout contenu pouvant être du code HTML non échappé dans les commentaires d'utilisateurs non enregistrés, ce qui est une bonne protection contre XSS, mais il étend également inutilement ce filtrage aux éléments <pre>. Sur mon blog, où presque tous les articles génèrent des commentaires qui tirent parti des extraits de code HTML, ce filtrage a causé beaucoup de problèmes à mes utilisateurs (et à moi-même).

Existe-t-il un moyen de "corriger" ce filtrage trop agressif à l'intérieur d'éléments <pre> dans les commentaires non enregistrés, sans le désactiver pour le reste du commentaire? De préférence, de manière à survivre aux mises à niveau.

2
Dave Ward

une petite solution; la surbrillance était dans mon 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

Bien que cela puisse être un peu plus que ce que vous cherchez, WP-Syntax désactive le filtrage HTML dans les balises <pre> des publications et des commentaires (autant que je sache (AFAIK). Cela fonctionne également pour Wordpress 3.0, même si le site Web indique que cela fonctionne uniquement avec la version 2.8.

Si vous cherchez à simplifier les choses, je suggère de regarder dans wp-syntax.php dans le plugin (plus précisément au bas de la page où ils utilisent add_filters() pour voir comment ils désactivent le filtrage HTML automatique de Wordpress dans les balises <pre>. Vous pouvez ensuite l'appliquer à des commentaires.

EDIT: J'ai consulté le fichier et ils utilisent regex et PHP preg_replace_callback() pour conserver le code HTML original dans les balises <pre>. Vous devrez peut-être le modifier pour répondre à vos besoins.

Vous auriez, par exemple (note: code non testé):

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