maksimerohin
12/28/2019 - 5:29 AM

AJAX

Безопасность

Безопасность запросов с помощью AJAX.

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

  1. Проверить nonce.
  2. Проверить права пользователя на выполнение операции.
  3. Очистить данные (передаваемые в запросе или получаемые из БД).

1. Код nonce (случайный код)

Nonce - это уникальная строка, которая создается и используется один раз - одноразовое число. Nonce проверка используется, когда нужно убедится, что запрос был послан с указанного «места».

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

add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){
  
  wp_localize_script('twentyfifteen-script', 'myajax', 
    array(
      'url' => admin_url('admin-ajax.php'),
      'nonce' => wp_create_nonce('myajax-nonce')
    )
  );  
  
}

twentyfifteen-script это название основного скрипта темы (см. выше), который подключается на сайте с помощью wp_enqueue_script().

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

var ajaxdata = {
    action     : 'myajax-submit',
    nonce_code : myajax.nonce
};
jQuery.post( myajax.url, ajaxdata, function( response ) {
    alert( response );
});

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

add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
function myajax_submit(){
    // проверяем nonce код, если проверка не пройдена прерываем обработку
    check_ajax_referer( 'myajax-nonce', 'nonce_code' );
    // или так
    if( ! wp_verify_nonce( $_POST['nonce_code'], 'myajax-nonce' ) ) die( 'Stop!');

    // обрабатываем данные и возвращаем
    echo 'Возвращаемые данные';

    // не забываем завершать PHP
    wp_die();
}

По возможности всегда используйте wp_die() вместо die() или exit(), в функции обработки AJAX запроса. Так вы добьетесь лучшей интеграции с WordPress и в случае ошибок в коде, получите данные о них.

Обратите внимание, что в данном случае Nonce код создается в HTML коде. А это значит, что если у вас установлен плагин страничного кэширования, то этот код может и наверняка будет устаревать к моменту очередного AJAX запроса, потому что HTML код кэшируется...