Sakurairo主题评论私密接口未授权风险
https://github.com/mirai-mamori/Sakurairo/pull/1422
演示
1. 评论私密接口未授权风险
所有评论的私密状态可以随意被更改
评论私密切换接口同时注册了未登录 AJAX 入口,并且请求不需要 nonce:
add_action('wp_ajax_nopriv_siren_private', 'siren_private');
add_action('wp_ajax_siren_private', 'siren_private');
REST API 获取最近评论 ID:
GET /wp-json/wp/v2/comments?per_page=XXXX&orderby=date&order=desc
返回第一项里的 id 即为后续 AJAX 请求的 p_id:

可构造请求:
POST /wp-admin/admin-ajax.php
action=siren_private&p_id=XXXX&p_action=set_private

2. 评论私密状态无法正确切换
只会写入私密状态:
update_comment_meta($comment_id, '_private', 'true');
评论只能被设为私密,不能再次点击恢复公开

修复内容
functions.php
- 移除
wp_ajax_nopriv_siren_private,只保留登录后的wp_ajax_siren_private - 评论按钮增加
data-noncep - 后端使用
absint()处理p_id,使用sanitize_key()处理p_action - 后端校验管理员权限、评论是否存在、以及当前评论 ID 绑定的 nonce:
check_ajax_referer('siren_private_' . $comment_id);
_private改为服务端切换逻辑:已私密则删除 meta,未私密则写入 meta。
js/page.js / js/page.js.map
修改src/page/index.js,这里一起加上了
-
从按钮读取
data-noncep: -
AJAX 请求追加
_wpnonce:
let ajax_data = "action=siren_private&p_id=" + idp + "&p_action=" + actionp + "&_wpnonce=" + noncep;
- 移除
private_now判断 - 确认文案改为“您确定要切换私密状态吗?”
验证
修复后



Comments NOTHING