CoreNext主题最新评论小工具防止注入

原理

通过在处理评论时移除html标签的方式进行处理,可以防止注入,代码关键的地方都有注释,可以参考。

代码示例

<?php

namespace core_next;

class comment extends \WP_Widget
{
    function __construct()
    {
        $img_html = Theme::getWidgetIcon();
        parent::__construct(
            'core_next_comments_widget',
            $img_html . 'CoreNext最新评论',
            array(
                'description' => '主题自带最新评论小工具'
            )
        );
        add_action('widget_update_callback', [$this, 'updateWidgetCache'], 10, 2);
    }

    function form($instance)
    {
        $num = absint($instance['number'] ?? 5);
        $title = $instance['title'] ?? '最新评论';
        $show_admin_comment = !empty($instance['show_admin_comment']) ? 'checked' : '';
        $on_top = !empty($instance['on_top']) ? 'checked' : '';

        ?>
        <div class="widget-item">
            <div>工具标题</div>
            <input class="widefat" name="<?php echo esc_attr($this->get_field_name('title')); ?>"
                   type="text" value="<?php echo esc_attr($title); ?>"/>
        </div>
        <div class="widget-item">
            <div>显示评论数量</div>
            <input class="widefat" name="<?php echo esc_attr($this->get_field_name('number')); ?>"
                   type="text" value="<?php echo esc_attr($num); ?>"/>
        </div>
        <div class="widget-item" style="display: flex;gap: 10px">
            <div>显示站长评论 <input class="widefat" type="checkbox"
                                     name="<?php echo $this->get_field_name('show_admin_comment'); ?>"
                    <?php echo $show_admin_comment; ?> ></div>
        </div>
        <div class="widget-item">
            <span>跟随页面展示   <input class="widefat" type="checkbox"
                                        name="<?php echo $this->get_field_name('on_top'); ?>"
                <?php echo $on_top; ?>></span>
        </div>
        <?php
    }

    public function widget_start($args, $instance)
    {
        $on_top = !empty($instance['on_top']) ? 'checked' : '';
        $html = $args['before_widget'];
        if ($on_top !== '') {
            $html = str_replace('<div', Theme::getWidgetStickyStyle(), $html);
        }
        echo $html;
        $title = apply_filters('widget_title', $instance['title']);
        echo $args['before_title'] . $title . $args['after_title'];
    }

    public function widget_end($args)
    {
        echo $args['after_widget'];
    }

    static function updateCache($id, $instance)
    {
        $num = absint($instance['number'] ?? 5);
        $comment_args = array(
            'number' => $num,
            'status' => 'approve'
        );
        $comments = Theme::Cache($id . '_query', function () use ($comment_args) {
            return get_comments($comment_args);
        }, true);
        Theme::Cache($id . '_list', function () use ($comments) {
            foreach ($comments as $comment) {
                $data = WordPress::getCommentMeta($comment, false);
                $data['date'] = date('n月j日', strtotime($comment->comment_date));
                $data['post_title'] = get_the_title($comment->comment_post_ID);
                $data['url'] = get_permalink($comment->comment_post_ID);
                $data['content'] = strip_tags($data['content']); // 移除标签
                $comment_list[] = $data;
            }
            return $comment_list;
        }, true);
    }

    function widget($args, $instance)
    {
        global $core_next_set;
        $num = absint($instance['number'] ?? 5);
        $show_admin_comment = !empty($instance['show_admin_comment']) ? 'checked' : '';

        $this->widget_start($args, $instance);
        $comment_args = array(
            'number' => $num,
            'status' => 'approve'
        );

        if ($show_admin_comment === '') {
            $comment_args['author__not_in'] = [1]; // 站长特权可以渲染(bushi)
        }
        $comment_list = [];
        if ($core_next_set['widget_comment_cache']) {
            $comments = Theme::Cache($this->id . '_query', function () use ($comment_args) {
                return get_comments($comment_args);
            });
            $comment_list = Theme::Cache($this->id . '_list', function () use ($comments) {
                foreach ($comments as $comment) {
                    $data = WordPress::getCommentMeta($comment, false);
                    $data['date'] = date('n月j日', strtotime($comment->comment_date));
                    $data['post_title'] = get_the_title($comment->comment_post_ID);
                    $data['url'] = get_permalink($comment->comment_post_ID);
                    $data['content'] = strip_tags($comment->comment_content); // 移除标签
                    $comment_list[] = $data;
                }
                return $comment_list;
            });
        } else {
            $comments = get_comments($comment_args);
            foreach ($comments as $comment) {
                $data = WordPress::getCommentMeta($comment, false);
                $data['date'] = date('n月j日', strtotime($comment->comment_date));
                $data['post_title'] = get_the_title($comment->comment_post_ID);
                $data['url'] = get_permalink($comment->comment_post_ID);
                $data['content'] = strip_tags($comment->comment_content); // 移除标签
                $comment_list[] = $data;
            }
        }

        echo '<div class="core-next-widget-comment">';
        if (is_array($comment_list)) {
            if (count($comment_list) > 0) {
                Template::echoListTemplateHtml('widget-comment', $comment_list, []);
            }
        }
        echo '</div>';
        $this->widget_end($args);
    }

    function updateWidgetCache($instance, $new_instance)
    {
        global $core_next_set;
        if ($core_next_set['widget_comment_cache']) {
            $show_admin_comment = isset($instance['show_admin_comment']) ?? 1;
            $id = $this->id;
            $num = absint($new_instance['number'] ?? 5);
            $comment_args = array(
                'number' => $num,
                'status' => 'approve'
            );
            if ($show_admin_comment != 1) {
                $comment_args['author__not_in'] = [1];
            }
            $comments = Theme::Cache($id . '_query', function () use ($comment_args) {
                return get_comments($comment_args);
            }, true);
            Theme::Cache($id . '_list', function () use ($comments) {
                foreach ($comments as $comment) {
                    $data = WordPress::getCommentMeta($comment, false);
                    $data['date'] = date('n月j日', strtotime($comment->comment_date));
                    $data['post_title'] = get_the_title($comment->comment_post_ID);
                    $data['url'] = get_permalink($comment->comment_post_ID);
                    $data['content'] = strip_tags($comment->comment_content); // 移除标签
                    $comment_list[] = $data;
                }
                return $comment_list;
            }, true);
        }
        return $new_instance;
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇