if (!current_user_can("edit_post", $post_id)) { return; }
if (!isset($_POST["abc_nonce"]) || !wp_verify_nonce($_POST["abc_nonce"], "abc_save_" . $post_id)) { return; }
$price = isset($_POST["abc_price"]) ? (float) $_POST["abc_price"] : null;
用投稿账号提交一篇文章,把表单里隐藏的文章编号改成别人的,保存后对方文章的价格字段被改成了 0.01。整个过程没有任何报错,作者也没收到通知。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,保存回调校验了 nonce 却没校验当前用户对这篇文章的编辑权限,也没确认字段是否允许该角色修改。编号来自表单,改一下就能指向别人的文章。
「自定义字段保存权限」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
处理上按这个顺序:保存前先用权限函数确认当前用户能编辑这篇具体文章;文章编号不要从表单接收 用当前请求里的对象编号;只接收白名单里的字段 其余一律丢弃。
改完只确认一件事:换投稿账号提交别人的文章编号,字段值不变,文章修订记录里也没有这次修改。
