回复框去掉管理员口令与处理状态;带 token 时昵称/邮箱锁定为只读

用户三个问题,本质是同一件事:token 就是身份凭证,那就不该再让表单声明身份。

一、去掉管理员口令 / 处理状态
  用户:「回复这个地方,下面有个管理员口令,还有处理状态,都不要填了,
        只保留回复内容,加上人机验证就可以了」
  - 删掉表单里这两块,删掉 admin-pw/admin-status 的 CSS 与 bindAdminToggle 的 JS
  - 管理员身份只认后台登录态(fb_is_admin()),不再从公开表单收口令
  - 状态流转只在后台详情页那排按钮里做

二、带 token 时昵称/邮箱锁定为只读
  用户:「如果他带着 Token 进来之后邮箱又让他改了,我们又没办法知道谁是谁了」
  - 有 token = 已证明是提交人本人,表单不再让填昵称/邮箱,
    改为显示只读的「回复身份」块(原昵称 + 原邮箱)

三、服务端强制(关键)
  🔴 前端设成 hidden 是不够的 —— hidden 可以被改:
     谁拿到链接、改个 email 提交,这条反馈的联系人就变成他的了。
     所以服务端在 isOwnerView 时**直接丢弃 POST 里的 name/email**,
     一律以库里那条帖子的 author_name / author_email 为准。
     身份校验必须在服务端做。

验证(这次确保请求真的通过人机验证,不是被验证码挡住造成的假通过):
  题目「2 乘以 7」答 14 → 跳转到 #r3,回复确实入库;
  提交的是 黑客改名 / attacker@evil.example,
  实际入库 name=jervis email=zeussun@msn.com —— 伪造的两个字段都被丢弃。
  另外:无 token 的普通访客仍可自由填昵称邮箱;全站已无「管理员口令」残留。
  测试回复已清理,reply_count 已同步。
This commit is contained in:
2026-11-03 10:02:57 +08:00
parent 8bcee46b8a
commit 8763e8e17f
5 changed files with 213 additions and 63 deletions
+3 -24
View File
@@ -61,29 +61,9 @@
}
}
/* ---------- 管理员口令:填写后显示"处理状态",并解除邮箱必填 ---------- */
function bindAdminToggle() {
var pw = document.querySelector('input[name=admin_password]');
if (!pw) { return; }
var statusBox = document.querySelector('.admin-status');
var emailInput = document.querySelector('input[name=email]');
var emailField = document.getElementById('emailField');
function sync() {
var isAdmin = pw.value.trim() !== '';
if (statusBox) { statusBox.hidden = !isAdmin; }
if (emailInput) {
emailInput.required = !isAdmin;
if (isAdmin) { emailInput.removeAttribute('required'); }
}
if (emailField) {
var req = emailField.querySelector('.req');
if (req) { req.style.visibility = isAdmin ? 'hidden' : 'visible'; }
}
}
pw.addEventListener('input', sync);
sync();
}
/* ---------- (已删)管理员口令切换 ----------
* 回复表单里不再有「管理员口令」和「处理状态」——用户 2026-11-03 要求去掉。
* 管理员身份改由后台登录态判断,状态流转在后台详情页的按钮里做。 */
/* ---------- 防止重复提交(上传未完成时阻止提交) ---------- */
function bindNoDoubleSubmit() {
@@ -884,7 +864,6 @@
function boot() {
bindCaptchaRefresh();
bindAdminToggle();
bindWontfixPanel();
bindColorPicker();
bindIconPicker();