it-swarm.dev

Entspanntes HTML-Filtern in <pre> -Tags?

Standardmäßig entfernt WordPress in Kommentaren nicht registrierter Benutzer alle Inhalte, die möglicherweise HTML-Code enthalten. Dies ist ein guter Schutz gegen XSS, erweitert aber unnötigerweise die Filterung auf <pre> -Elemente. In meinem Blog, in dem fast jeder Beitrag Kommentare generiert, die von HTML-Codefragmenten profitieren, hat diese Filterung meinen Benutzern (und mir) viele frustrierende Probleme bereitet.

Gibt es eine Möglichkeit, diese übermäßig aggressive Filterung in <pre>-Elementen in nicht registrierten Kommentaren zu "korrigieren", ohne sie für den Rest des Kommentars zu deaktivieren? Am liebsten so, dass Upgrades überleben.

2
Dave Ward

eine kleine Lösung; Die Hervorhebung erfolgte in meinem Blog per 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

Obwohl dies möglicherweise etwas mehr ist, als Sie suchen, deaktiviert WP-Syntax die HTML-Filterung in <pre>-Tags in Posts und Kommentaren (AFAIK). Es funktioniert auch für Wordpress 3.0, obwohl die Website angibt, dass es nur mit 2.8 funktioniert.

Wenn Sie es einfacher machen möchten, empfehlen wir Ihnen, wp-syntax.php im Plugin zu lesen (insbesondere ganz unten, wo sie add_filters() verwenden, um zu sehen, wie sie die automatische HTML-Filterung von Wordpress in <pre> -Tags deaktivieren. Sie können dies dann auf Kommentare anwenden.

BEARBEITEN: Ich habe mir die Datei angesehen und sie verwenden Regex und PHP preg_replace_callback() , um den ursprünglichen HTML-Code in <pre>-Tags beizubehalten. Möglicherweise müssen Sie es an Ihre Bedürfnisse anpassen.

Sie hätten zum Beispiel (Anmerkung: ungetesteter Code):

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