Willin Kan 內置嵌套评论专用 Ajax comments的一个安全bug修复 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

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

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

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 工作太忙了吧,没时间来修复这些。

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

/**
普通评论者:邮箱正确、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']
                && $new_timestamp - $old_timestamp < 3600;
    return $rs;
}

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

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’ uh?' );
    }

} 
else 
{
$comment_id = wp_new_comment( $commentdata );
}

Tagged in :

All Comments (0)
Gravatar image
No Comments