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 );
}
All Comments (0)