什么是 Ajax 评论?通俗地讲就是:一般情况下发表一条评论,页面就会刷新一次;而用了这款插件以后,提交评论后,评论将直接出现在评论列表中,而不用再刷新页面。我的 WordPress 就有应用到,并且用的是高手 Willin Kan 开发的那一款,它分为1.29和1.3两个版本,前者适用于 WordPress 2.9 及以下版本,后者适用于 WP 3.0 版本以上。这款插件非常好用,但也存在一个安全漏洞,利用此漏洞,匿名用户可以篡改任意评论,所以必须进行修复!

确定自己用的是不是这款Ajax?

如果你在主题目录(/wp-content/themes/主题名/)下找到这两个文件:
comments-ajax.js
comments-ajax.php
且 comments-ajax.js 以下列内容为开头:
/**
* WordPress jQuery-Ajax-Comments v1.3 by Willin Kan.
* URI: http://kan.willin.org/?p=1271
*/
那就说明你正在使用这款插件。

安全漏洞的位置

问题代码就出在 comments-ajax.php 的第 116 ~ 第 122 行(如果文件有修改过,可能不在这几行),问题代码如下:
// 增加: 檢查評論是否正被編輯, 更新或新建評論
if ( $edit_id ){
$comment_id = $commentdata['comment_ID'] = $edit_id;
wp_update_comment( $commentdata );
} else {
$comment_id = wp_new_comment( $commentdata );
}

而 $edit_id 从这里来:$edit_id = ( isset($_POST['edit_id']) ) ? $_POST['edit_id'] : null;这里没有做任何限制,只要有 $edit_id 传过来便会更新评论,安全漏洞由此产生。

漏洞修复

1、用 Notepad++ 等高级文本编辑器打开 comments-ajax.php。
2、在最前在的一段注释后加入以下代码:
session_start();

修改完后,代码像这样:
/**
* WordPress 內置嵌套評論專用 Ajax comments >> WordPress-jQuery-Ajax-Comments v1.3 by Willin Kan.
*
* 說明: 這個文件是由 WP 3.0 根目錄的 wp-comment-post.php 修改的, 修改的地方有注解. 當 WP 升級, 請注意可能有所不同.
*/
session_start();

if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
header('Allow: POST');
header('HTTP/1.1 405 Method Not Allowed');
header('Content-Type: text/plain');
exit;
}

3、将刚刚提到的问题代码替换成以下内容:

// 增加: 檢查評論是否正被編輯, 更新或新建評論
if ( $edit_id ){
if($_SESSION['comment_id']==$edit_id){
$comment_id = $commentdata['comment_ID'] = $edit_id;
wp_update_comment( $commentdata );
}else{
err(__('您没有更改此评论的权限!'));
}
} else {
$comment_id = wp_new_comment( $commentdata );
$_SESSION['comment_id']=$comment_id;
}

4、保存,并将 comments-ajax.php 上传替换原文件即可。此时,安全漏洞已被修复。经测试,此方法同样适用于 1.29 版本。