it-swarm-id.com

Bersantai penyaringan HTML yang tidak terhapus di dalam tag <pre>?

Secara default, WordPress menghapus konten apa pun yang mungkin merupakan HTML yang tidak terhapuskan dalam komentar dari pengguna yang tidak terdaftar, yang baik untuk melindungi terhadap XSS, tetapi itu tidak perlu memperluas pemfilteran ke elemen <pre> juga. Di blog saya, di mana hampir setiap posting menghasilkan komentar yang mendapat manfaat dari cuplikan kode HTML, pemfilteran itu telah menyebabkan banyak masalah yang membuat frustrasi para pengguna (dan saya sendiri).

Apakah ada cara untuk "memperbaiki" pemfilteran yang terlalu agresif di dalam elemen <pre> dalam komentar yang tidak terdaftar, tanpa menonaktifkannya selama sisa komentar? Lebih disukai, dengan cara yang bertahan upgrade.

2
Dave Ward

solusi kecil; Sorotannya ada di blog saya 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

Meskipun ini mungkin sedikit lebih banyak daripada yang Anda cari, WP-Syntax menonaktifkan penyaringan HTML di dalam tag <pre> di dalam posting dan komentar (AFAIK). Ini juga berfungsi untuk Wordpress 3.0, meskipun situs web mengatakan hanya berfungsi dengan 2.8.

Jika Anda ingin membuatnya lebih sederhana, saya sarankan mencari wp-syntax.php di dalam plugin (khususnya di bagian paling bawah di mana mereka menggunakan add_filters() untuk melihat bagaimana mereka menonaktifkan pemfilteran HTML otomatis Wordpress dalam tag <pre>. Kemudian Anda dapat menerapkannya pada komentar.

EDIT: Saya telah melihat file, dan mereka menggunakan regex dan PHP preg_replace_callback() untuk melestarikan HTML asli dalam tag <pre>. Anda mungkin harus memodifikasinya agar sesuai dengan kebutuhan Anda.

Anda akan memiliki, misalnya (catatan: kode yang belum diuji):

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