Отклонять все AJAX запросы, кроме... (WordPress)
Дoбрый дeнь. Возникла необходимость отклонять все AJAX запросы к admin-ajax.php, если они исходят не от администратора или формы обратной связи. Данный код работает, но возник вопрос - может ли WordPress самостоятельно инициировать обращения к admin-ajax.php (как он это делает с wp-cron.php)? Если да, то каким образом можно внести его в исключения?
add_action('admin_init', 'my_ajax_checker', 10, 2);
function my_ajax_checker() {
// Делаем исключение для формы обратной связи
$send_form = $_POST['action'] === 'elementor_pro_forms_send_form';
// Отклонять все AJAX запросы, кроме администратора и формы обратной связи
if( defined('DOING_AJAX') && DOING_AJAX && !current_user_can('manage_options') && !$send_form) {
$response = array( 'message' => 'Error', 'data' => array (), );
wp_send_json_error( $response );
}
}
Ответы (1 шт):
Не посмотрев тольком код в вопросе и памятую проблему в предыдущем, я написал такой код:
/**
* Whitelist ajax calls.
*
* @param string $tag The name of the action to be executed.
* @param mixed ...$arg Optional. Additional arguments which are passed on to the
* functions hooked to the action. Default empty.
*/
function whitelist_ajax( $tag, ...$arg ) {
if ( 0 !== strpos( $tag, 'wp_ajax_' ) ) {
return;
}
$whitelist = [
'elementor_pro_forms_send_form',
];
$action = preg_replace( '/(?:wp_ajax_|wp_ajax_nopriv_)(.+)/', '$1', $tag );
if ( in_array( $action, $whitelist, true ) ) {
return;
}
$response = new WP_Error( '', 'Ajax request blocked' );
wp_send_json_error( $response );
}
add_action( 'all', 'whitelist_ajax' );
Он протестирован и работает.
Но по сути, ваш код и код в ответе практически идентичны по функционалу за тем исключением, что мой код срабатывает позднее и позволяет WordPress ответить 400, если действие (action) не зарегистрировано.