Защита: используем nonce и проверяем права

Нет острой необходимости проверять каждых Ajax запрос и разработчики часто игнорируют такую проверку, получая самый неожиданный результат. Недобросовестные пользователи могут каким-либо образом изменить свои права и навредить сайту над которым вы работали долгие месяцы.

Существует 2 вида защиты, которые нужно использовать в Ajax запросах в большинстве случаев.

1. Случайный код nonce

Nonce — это уникальная строка, которая создается и используется один раз (once). Nonce проверка используется, когда нужно убедится, что запрос был послан с указанного места.

В WordPress есть функции wp_create_nonce() и wp_verify_nonce() — это базовые функции для создания и последующей проверки nonce кода. С их помощью мы и будем создавать защиту nonce для ajax запросов.

Для начала создадим nonce код:

  1. wp_localize_script( ‘jquery’, ‘myajax’,
  2. array(
  3.    ‘url’ => admin_url(‘admin-ajax.php’),
  4.    ‘nonce’ => wp_create_nonce(‘myajax-nonce’)
  5. ));

Затем, в Ajax запросе добавим переменную с кодом nonce:

  1. jQuery.post(
  2.     MyAjax.ajaxurl,
  3.     {
  4.     action : ‘myajax-submit’,
  5.     // отправим код nonce вместе с остальными данными
  6.     nonce : myajax.nonce
  7.     },
  8.     function( response ) {
  9.         alert( response );
  10.     }
  11. );

Теперь, в обработке заброса необходимо проверить nonce код:

  1. add_action( ‘wp_ajax_nopriv_myajax-submit’, ‘myajax_submit’ );
  2. add_action( ‘wp_ajax_myajax-submit’, ‘myajax_submit’ );
  3. function myajax_submit() {
  4.     $nonce = $_POST[‘nonce’];
  5.     // проверяем nonce код, если проверка не пройдена прерываем обработку
  6.     if ( !wp_verify_nonce( $nonce, ‘myajax-nonce’ ) )
  7.         die ( ‘Stop!’)
  8.     // обрабатываем данные и возвращаем
  9.     // Не забываем выходить
  10.     exit;
  11. }

2. Проверка прав доступа

Этот вид защиты подойдет только для обработки запросов авторизованных пользователей, т.е. для пользователей без регистрации ajax запросы работать не будут, это не всегда подходит.

В этой проверке, используем функцию current_user_can():

Код
  1. add_action( ‘wp_ajax_nopriv_myajax-submit’, ‘myajax_submit’ );
  2. add_action( ‘wp_ajax_myajax-submit’, ‘myajax_submit’ );
  3. function myajax_submit() {
  4.     $nonce = $_POST[‘nonce’];
  5.     // проверяем nonce код, если проверка не пройдена прерываем обработку
  6.     if ( !wp_verify_nonce( $nonce, ‘myajax-nonce’ ) )
  7.         die (‘Stop!’)
  8.     if ( !current_user_can( ‘manage_options’ ) )
  9.         die (‘Stop!’)
  10.     // обрабатываем данные и возвращаем их
  11.     // Не забываем выходить
  12.     exit;
  13. }

Источник: http://wp-kama.ru/id_2018/ajax-v-wordpress.html