it-swarm-ko.tech

<pre> 태그 안에서 이스케이프 처리되지 않은 HTML 필터링을 완화 하시겠습니까?

기본적으로 WordPress는 등록되지 않은 사용자의 주석에서 이스케이프 처리되지 않은 HTML이 될 수있는 콘텐츠를 제거합니다. XSS로부터 보호하기에 좋지만 불필요하게 필터링을 <pre> 요소로 확장합니다. 거의 모든 게시물에서 HTML 코드 단편의 혜택을받는 주석을 작성하는 블로그에서 필자는 사용자 (및 나 자신)에게 많은 좌절감을 안겨줍니다.

주석의 나머지 부분을 비활성화하지 않고 등록되지 않은 주석 내에서 <pre> 요소 내부의 지나치게 공격적인 필터링을 "수정"할 수있는 방법이 있습니까? 업그레이드를 견뎌내는 방식으로하는 것이 바람직합니다.

2
Dave Ward

작은 해결책; 강조는 자바 스크립트를 통해 내 블로그에있었습니다.

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

이보다 약간 더 있지만, WP-Syntax 는 게시물 및 주석 (AFAIK) 내의 <pre> 태그 내에서 HTML 필터링을 비활성화합니다. 그것은 웹 사이트가 2.8에서만 작동한다고하더라도 Wordpress 3.0에서도 작동합니다.

좀 더 간단하게 만들려면 플러그인 내의 wp-syntax.php (특히 add_filters()을 사용하여 <pre> 태그 내에서 Wordpress의 자동 HTML 필터링을 비활성화하는 방법을 확인하십시오.)을 참조하십시오. 그런 다음 주석에 적용 할 수 있습니다.

편집 : 파일을 살펴 봤는데, 그들은 regex 및 PHP의 preg_replace_callback()<pre> 태그 내에서 원본 HTML 보존하기 위해 사용합니다. 필요에 맞게 수정해야 할 수도 있습니다.

예를 들면 다음과 같습니다 (참고 : 테스트되지 않은 코드).

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