it-swarm.cn

在<PRE>标签内放松未转义的HTML过滤?

默认情况下,WordPress在未注册用户的评论中删除可能未转义HTML的任何内容,这样可以防止XSS,但它也不必要地将过滤扩展到<pre>元素。在我的博客上,几乎每个帖子都会生成受益于HTML代码段的评论,这种过滤导致了我的用户(和我自己)很多令人沮丧的麻烦。

有没有办法在未注册的注释中“修复”<pre>元素内过度激进的过滤,而不会在注释的其余部分禁用它?优选地,以升级存活的方式。

2
Dave Ward

小解决方案;突出显示是通过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

虽然这可能比您正在寻找的更多,但是 WP-Syntax 禁用帖子和评论(AFAIK)中<pre>标签内的HTML过滤。它也适用于Wordpress 3.0,尽管该网站表示它仅适用于2.8。

如果你想让它变得更简单,我建议在插件中查看wp-syntax.php(特别是在他们使用add_filters()的最底层,看看他们如何在<pre>标签中禁用Wordpress的自动HTML过滤。然后你可以将它应用于评论。

编辑:我查看了该文件,他们使用正则表达式和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