WordPress: capabilities и nonce
Проверяйте право на действие и CSRF-защиту отдельно. Nonce не заменяет авторизацию.
Плохо
check_admin_referer('save_post');
wp_update_post($data);
Хорошо
if (!current_user_can('edit_post', $post_id)) {
wp_die('Forbidden', '', ['response' => 403]);
}
check_admin_referer('save_post_' . $post_id);
$result = wp_update_post(wp_slash([
'ID' => $post_id,
'post_title' => $validated_title,
]), true);
if (is_wp_error($result)) {
wp_die('Save failed', '', ['response' => 500]);
}
Почему это важно
Знание nonce не даёт права изменять произвольную запись. Проверка capability учитывает объект и текущего пользователя.
Когда применять
WordPress, обработчик формы в админке. Форма создаёт соответствующий wp_nonce_field; $post_id — проверенный ID из маршрута, $validated_title — валидированная строка без служебных слешей. В запись передаётся тот же ID, на который проверено право; wp_slash подготавливает массив для API WordPress. Для REST используйте permission_callback и механизм аутентификации REST.
Кто что делает
Человек
Определяет права редакторов и разрешённые поля.
AI-агент
Добавляет capability, nonce, валидацию и проверяет запрещённое редактирование.
Пример применения
Редактор сохраняет карточку товара: сервер проверяет его право на конкретную запись, nonce этой формы и список разрешённых полей.
Как проверить у себя
- Пользователь без edit_post получает отказ.
- Неверный nonce отклоняется.
Первоисточники
Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.