当内容中存在箭头符号“<”时,快捷码输出会出错

时间:2015-10-15 作者:Silver Moon

我有一个非常简单的快捷码,可以使用pre标记打印一些文本

function term_shortcode( $atts, $content = null ) 
{
    return "<pre>" . htmlentities($content) . "</pre>";
}
add_shortcode( \'term\', \'term_shortcode\' );
但是,在使用短代码时,如果内容中有箭头符号,输出就会变得非常糟糕。短代码拾取短代码端以外的内容。

下面是一个示例

[term]    
ABC < DEF
[/term]
MORE CONTENT. This is also taken up by the above shortcode.
如果左箭头字符“<;”移除后,输出良好。

如何修复此问题?

Visual editor已完全禁用。只需使用文本编辑器并键入纯html。

3 个回复
最合适的回答,由SO网友:bonger 整理而成

WP 4.2.3中引入了该问题,并引入了do_shortcodes_in_html_tags() 函数,该函数对内容进行HTML解析,以防止包含不可信贡献者/作者编写的短代码的内容,这些贡献者/作者通过专门制作短代码属性可以创建XSS漏洞。

如果这种安全状况不适用于您,并且您只想在您的站点上使用它,那么一个简单的解决方法是替换默认的do_shortcode 使用您自己的版本进行筛选,并调用do_shortcodes_in_html_tags() 已删除,例如

add_action( \'init\', function () {
    remove_filter( \'the_content\', \'do_shortcode\', 11 );
    add_filter( \'the_content\', function ( $content ) {
        global $shortcode_tags;

        if ( false === strpos( $content, \'[\' ) ) {
            return $content;
        }

        if (empty($shortcode_tags) || !is_array($shortcode_tags))
            return $content;

        $tagnames = array_keys($shortcode_tags);
        $tagregexp = join( \'|\', array_map(\'preg_quote\', $tagnames) );
        $pattern = "/\\\\[($tagregexp)/s";

        if ( 1 !== preg_match( $pattern, $content ) ) {
            // Avoids parsing HTML when there are no shortcodes or embeds anyway.
            return $content;
        }

        // Avoid check for users without unfiltered html: $content = do_shortcodes_in_html_tags( $content, $ignore_html );

        $pattern = get_shortcode_regex();
        $content = preg_replace_callback( "/$pattern/s", \'do_shortcode_tag\', $content );

        // Always restore square braces so we don\'t break things like <!--[if IE ]>
        // Not needed if do_shortcodes_in_html_tags not called: $content = unescape_invalid_shortcodes( $content );

        return $content;
    }, 11 );
} );
在我的测试中,你可能还需要wpautop() 但也存在一些问题。。。

SO网友:Mark Kaplun

短代码不应替代html标记。在这种情况下,如果要使用<pre> 只要使用它,不要为它发明一个短代码。

“<;”的用法破坏了内容中html的有效性,这可能会破坏所有类型的解析器,也可能会破坏短代码解析器(几乎可以肯定的是,在版本4.4+中会更难破坏它)。

在你的情况下,与你尝试做的相反的可能是更好的方法。与编码html元素不同,您应该假设它们已经编码,并对它们进行解码以将它们放入<pre>. 这样,您还可以使用可视化编辑器来编辑短代码。

SO网友:Benjamin Love

我会尝试使用htmlspecialchars() 而不是htmlentities() 看看这是否解决了问题。

相关推荐

Namespaced shortcode?

我正在改造一个旧的WP站点,该站点有许多自定义的短代码,显然由于代码当前的组织方式,这些短代码在性能方面付出了代价。当然,我可以修复优化不好的代码,使用十几个短代码,并且一天就可以完成,但我想知道如何更好地组织它们。根据WordPress\'documentation, 建议将它们放在插件中并在上初始化init. 我们可以通过这样“命名”它们来减少这个钩子中的负载吗?[com.company shortcode attr=\"attr\" prop=\"prop\"] 有人尝试过这样的解决方案吗