Sakurairo主题评论私密接口未授权风险

发布于 1 小时前  5 次阅读


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

image-20260809192359670

可构造请求:

POST /wp-admin/admin-ajax.php
action=siren_private&p_id=XXXX&p_action=set_private

image-20260809191614579

2. 评论私密状态无法正确切换

只会写入私密状态:

update_comment_meta($comment_id, '_private', 'true');

评论只能被设为私密,不能再次点击恢复公开

recording

修复内容

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 判断
  • 确认文案改为“您确定要切换私密状态吗?”

验证

修复后

recording

image-20260809194938004

QQ:2219349024
最后更新于 2026-09-12