修复ajax comments的bug

文章目录

好多wordpress的大神修复了ajax comments的bug,我在这里也拾人牙慧一下。ajax comments是willin can大师写的一个ajax评论功能,作为不太懂php和js的菜鸟,从来没有认真的去阅读代码,好在大神们看出bug来了,希望在用这个功能的同学们快修改一下。

Ajax comments的bug

对于该bug我也只能发表个人浅见,毕竟不是科班出身。bug主要是因为这句话,
comments-ajax.php中:

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是通过如下方式获得的:

1
$edit_id              = ( isset($_POST['edit_id']) ) ? $_POST['edit_id'] : null; // 提取 edit_id

那么post的表单在哪里呢?在comments-ajax.js文件中有:

1
2
3
4
$('#commentform').submit(function() {
		$('#loading').slideDown();
		$submit.attr('disabled', true).fadeTo('slow', 0.5);
		if ( edit ) $('#comment').after('<input type="text" name="edit_id" id="edit_id" value="' + edit + '" style="display:none;" />');

可见在提交评论的时候,会post一个name为edit_id的表单,edit的值就是评论的comment id。

所以如果我们post一个任意的comment id,就可以篡改该评论内容,这就是bug所在。

修复Ajax comments的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 );
}

替换为如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
普通评论者:邮箱正确、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&#8217; uh?' );
    }
}
else
{
$comment_id = wp_new_comment( $commentdata );
}

小结

还是要多思,勤思才能提高进步,为了写这个,强迫自己看了下comments-ajax.js中的代码,总算稍微看懂了些。

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

本文出自 TENNFY博客,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/1566.html

下一篇文章:

上一篇文章:

19人参与了讨论

  1. xilouqingzhu 说:

    表示依然看不懂,我那里有此bug么,换个香港主机却苦逼的宕机 : :cry:

  2. tiandi 说:

    这个BUG存在里很多年头了。

  3. 极雪 说:

    :shock: 没遇到有无聊的人篡改评论

  4. Youth.霖 说:

    我也还是看不懂。。。。

  5. ERa 说:

    不太明白,这个bug。
    有多大的作用。

  6. Pang 说:

    我那还木弄comments-ajax :shock: :shock: :shock:

  7. Nat 说:

    :razz: 感谢 测试下

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

7 + 2 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部