it-swarm-vi.tech

Thư giãn lọc HTML không thoát trong thẻ <pre>?

Theo mặc định, WordPress loại bỏ bất kỳ nội dung nào có thể không được giải mã HTML trong các nhận xét từ người dùng chưa đăng ký, điều này rất tốt để bảo vệ chống lại XSS, nhưng nó cũng mở rộng việc lọc thành các phần tử <pre> một cách không cần thiết. Trên blog của tôi, nơi hầu hết mọi bài đăng đều tạo ra các nhận xét có lợi từ đoạn mã HTML, việc lọc đó đã gây ra cho người dùng của tôi (và bản thân tôi) nhiều rắc rối bực bội.

Có cách nào để "khắc phục" việc lọc quá mạnh mẽ bên trong các phần tử <pre> trong các nhận xét chưa đăng ký, mà không vô hiệu hóa nó cho phần còn lại của nhận xét không? Tốt hơn là, theo cách sống sót nâng cấp.

2
Dave Ward

một giải pháp nhỏ; điểm nổi bật là trong blog của tôi thông qua 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

Mặc dù điều này có thể nhiều hơn một chút so với bạn đang tìm kiếm, WP-Syntax vô hiệu hóa tính năng lọc HTML trong các thẻ <pre> bên trong các bài đăng và nhận xét (AFAIK). Nó cũng hoạt động cho Wordpress 3.0, mặc dù trang web cho biết nó chỉ hoạt động với 2.8.

Nếu bạn đang tìm cách làm cho nó đơn giản hơn, tôi khuyên bạn nên tìm kiếm wp-syntax.php trong plugin (cụ thể là ở phía dưới nơi họ sử dụng add_filters() để xem cách họ vô hiệu hóa tính năng lọc HTML tự động của Wordpress trong các thẻ <pre>.

EDIT: Tôi đã xem tệp và họ sử dụng regex và PHP preg_replace_callback() để giữ HTML gốc trong các thẻ <pre>. Bạn có thể phải sửa đổi nó để phù hợp với nhu cầu của bạn.

Bạn sẽ có, ví dụ (lưu ý: mã chưa được kiểm tra):

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