Intereting Posts
Перемещение существующей установки WordPress в Multisite $ wpdb-> заподлицо (); прерывает цикл Обновление wpdb добавляет текущую временную метку не работает Как отображать сообщение из одного пользовательского типа сообщения в другом настраиваемом типе сообщений с той же таксономией? Вызов внешнего объекта в функции класса во время обратного вызова Расширенные пользовательские поля / редактор роли пользователя – как скрыть ACF для определенных пользователей? Передача таксономии идентификатора таксономии нажата на одной странице на другую страницу Какова ваша наилучшая практика для выполнения одноразовых скриптов? Медленный запрос для таблицы wp_options Создайте настраиваемый столбец столбца, путем персонализированного сообщения Показывать пользовательские данные вместо 404 Добавление разбивки на страницы для запроса пользовательской страницы Как изменить заголовки администратора Как определить (через php), если сайт использует статическую домашнюю страницу? Все в одном Сео и постоянные ссылки

Отключить внешний доступ к конечной точке API REST

Я играю с WP REST API и настраиваю маршрут, который используется для создания нового пользователя при отправке формы с домашней страницы. Вот как я настраиваю конечную точку:

add_action('init', 'test_init'); function test_init() { // register the route add_action('rest_api_init', function () { register_rest_route( 'test/api/v1', '/user/add', array( 'methods' => 'POST', 'callback' => 'test_add_user', )); }); } function test_add_user() { // make sure all data is available if (!isset($_POST['firstname'], $_POST['surname'], $_POST['email'], $_POST['password'])) { exit; } // check so the user not already exists if (username_exists($_POST['firstname'])) { exit; } // create a new user $user = array( 'user_pass' => $_POST['password'], 'user_login' => $_POST['firstname'], 'user_email' => $_POST['email'], 'first_name' => $_POST['firstname'], 'last_name' => $_POST['surname'], 'role' => 'author' ); $user_id = wp_insert_user($user); // return the id of the created user echo json_encode(array('id' => $user_id)); exit; } 

Мне интересно, как лучше всего предотвратить внешний доступ к этому маршруту? Мне нужны только данные из фактической формы на главной странице, чтобы иметь возможность отправлять данные в эту конечную точку.

Я попытался проверить происхождение в обратном вызове, но я не уверен, что это правильный способ сделать это:

 function test_add_user() { // only allow request from the same origin if (get_http_origin() != home_url()) { exit; } ... } 

Я, хотя, возможно, используя нонцы или что-то в этом направлении?

Возможно, я также должен упомянуть, что пользователь, отправляющий форму, не регистрируется, поэтому я не могу использовать аутентификацию на основе cookie или аналогичную.

Я бы предложил не использовать WP REST API для этой цели, поскольку он используется на домашней странице, а не в удаленном приложении / службе.
API REST должен предоставлять доступ к любым уже общедоступным данным удаленному разработчику.
Поскольку вы не предоставляете публичные данные, а регистрируете пользователей с домашней страницы, Ajax может быть хорошей альтернативой.
Из официального руководства API REST WordPress

WordPress REST API предоставляет конечные точки API для типов данных WordPress, которые позволяют разработчикам удаленно взаимодействовать с сайтами, отправляя и получая объекты JSON (Object Object Notation).

Однако это не единственный случай использования.

Я бы предложил использовать Ajax для этой цели.

  • Включите nonce с запросом Ajax.

  • Подцепите обработчик запроса Ajax с помощью действия wp_ajax_nopriv .

Это гарантирует, что пользователь не войдет в систему, а nonce гарантирует, что форма была создана WordPress.
Есть плагины, уже доступные для регистрации пользователей Ajax, премиум и бесплатно, репозиторий плагинов WordPress станет хорошим началом.
Я надеюсь, что этот альтернативный подход поможет.