ОбязательноWordPressPHP

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 отклоняется.
ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.