Willin Kan 內置嵌套评论专用 Ajax comments的一个安全bug修复

Willin Kan 內置嵌套评论专用 Ajax comments ,玩WP的几乎无人不知。
不过我发现其中存在一个安全漏洞。利用此bug,匿名用户可篡改任意评论内容。
问题代码出在:

1
2
3
4
5
6
if ( $edit_id ){
$comment_id = $commentdata['comment_ID'] = $edit_id;
wp_update_comment( $commentdata );
} else {
$comment_id = wp_new_comment( $commentdata );
}

这里没有做其它限制,发现只要有 edit_id 传递过来便更新评论,由此导致bug产生。其实这个问题SimpleDark的作者也应该提起过。可能是Willin 工作太忙了吧,没时间来修复这些。

这里给出一个解决方案:
增加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
普通评论者:邮箱正确、ip相符、时间在一小时之内方可更新
@code by 荒野无灯
*/

function ihacklog_user_can_edit_comment($new_cmt_data,$comment_ID = 0) {
    if(current_user_can('edit_comment', $comment_ID)) {
        return true;
    }
    $comment = get_comment( $comment_ID );
    $old_timestamp = strtotime( $comment->comment_date);
    $new_timestamp = current_time('timestamp');
    // 不用get_comment_author_email($comment_ID) , get_comment_author_IP($comment_ID)
    $rs = $comment->comment_author_email === $new_cmt_data['comment_author_email']
            && $comment->comment_author_IP === $_SERVER['REMOTE_ADDR']
                &#038;&#038; $new_timestamp - $old_timestamp < 3600;
    return $rs;
}

然后把最上面帖出来的那段代码替换为下面的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if ( $edit_id )
{
    $comment_id = $commentdata['comment_ID'] = $edit_id;
    if( ihacklog_user_can_edit_comment($commentdata,$comment_id) )
    {  
        wp_update_comment( $commentdata );
    }
    else
    {
        err( 'Cheatin&#8217; uh?' );
    }

}
else
{
$comment_id = wp_new_comment( $commentdata );
}
更多
11 Responses Post a comment
  1. WordPress主题

    我用了也是空白,打不开。不知道这2个代码片段是否放错了位置。求大神指导。

  2. 第十一颗行星

    请问一下,把function这段放入function.php以后,网站就打不开了,截断以后发现是
    $rs = $comment->comment_author_email === $new_cmt_data['comment_author_email']
    && $comment->comment_author_IP === $_SERVER['REMOTE_ADDR']
    && $new_timestamp - $old_timestamp < 3600;
    return $rs;
    这段引起的,我也不知道该如何修改,可能是主题哪里不适合这段吧。谢谢

  3. 阿军

    我的评论框在评论列表上面,且评论列表实现了时间倒序,使用了这个AJAX新发表的评论总是在评论框上面。请帮忙修改如何才能使这个AJAX的新评论在评论框下面呀? 谢谢

  4. 荒野无灯

    @phoetry
    $new_cmt_data 是直接传递过来的,里面包含了email,再用POST过来的显得怪异。

  5. phoetry

    可以用$_POST['email']吧, 省一个参数.
    我之前只检查了一下email, 来去把ip也加上...

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS