it-swarm.asia

<pre> etiketlerinin içindeki çıkmayan HTML filtrelemeyi gevşetmek mi istiyorsunuz?

Varsayılan olarak, WordPress kayıtsız HTML'den kayıtsız olabilecek herhangi bir içeriği, XSS'ye karşı korumanın iyi olduğu, kayıtsız kullanıcılar tarafından yapılan yorumlardan çıkarır, ancak gereksiz yere bu filtrelemeyi <pre> öğelerine de genişletir. Blogumda, neredeyse her gönderinin HTML kod parçacıklarından yararlanan yorumlar ürettiği, bu filtrelemenin kullanıcılarımın (ve kendimin) çok sinir bozucu bir sorun çıkarmasına neden olduğu belirtiliyor.

Kayıtsız yorumlarda <pre> öğelerinin içindeki aşırı agresif filtrelemeyi, yorumun geri kalanı için devre dışı bırakmadan "düzeltmenin" bir yolu var mı? Tercihen, yükseltmelerden kurtulacak şekilde.

2
Dave Ward

küçük bir çözüm; Vurgulama benim blogumda javascript ile yapıldı.

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

Bu, aradığınızdan biraz daha fazla olsa da, WP-Syntax , yazıların ve yorumların içindeki <pre> etiketleri içinde HTML filtrelemeyi devre dışı bırakır (AFAIK). Ayrıca, web sitesinde sadece 2.8 ile çalıştığını söylediği halde Wordpress 3.0 için de çalışıyor.

Daha basit hale getirmek istiyorsanız, eklentinin içindeki wp-syntax.php'ye bakmanızı öneririm (özellikle WordPress'in <pre> etiketleri içindeki otomatik HTML filtresini nasıl devre dışı bıraktıklarını görmek için add_filters() işlevini kullanırlar. Bunu yorumlara uygulayabilirsiniz.

EDIT: Dosyaya baktım ve orjinal HTML'yi <pre> etiketleri içinde korumak için regex ve PHP'leri preg_replace_callback() kullanıyorlar. Gereksinimlerinize uyacak şekilde değiştirmeniz gerekebilir.

Örneğin, (not: denenmemiş kod):

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