Intereting Posts
Новый пользователь, созданный как Участник, а не Участник jQuery UI Sortable не работает с Metabox Детские темы Проблемы с приоритетом CSS без использования! Important Как остановить WordPress от смены эллипсиса на предварительно сформированный трехзначный глиф? Как использовать json_decode значение post_meta? если has_term показывает на обычной странице архива Добавьте страницу администратора, но не показывайте ее в меню администратора Добавление параметров экрана в настраиваемые страницы администрирования Удаление (замена) avtar в комментариях.php с помощью некоторых других HTML-схем Пользовательская разбивка на страницы в коротком коде с WP_Query Каков наилучший способ контролировать функции / исполнения PHP? Категории виджета отображаются пустыми? Как удалить файлы cookie, защищенные паролем, после выхода пользователя с сайта Поиск по полям пользовательских полей отображать таксономию с помощью идентификатора термина

WordPress Ajax Data Security

Я знаю, что nonces проверяет намерения, но не может иметь никакого смысла, если я могу использовать их, чтобы ограничить чтение базы данных каким-то образом? Я имею в виду, что я извлекаю записи из базы данных с помощью AJAX, но я не хочу, чтобы кто-либо имел эти данные другими способами (POST-запросы на эту страницу admin-ajax.php ).

Например, в моем обработчике AJAX у меня такая большая работа (я посылаю $myid вместе с действием в вызове AJAX):

 $myid = 5575; $query = "SELECT `id` FROM table WHERE `user_id` = $myid;"; $data = $wpdb->get_col( $query ); echo json_encode($data); die(); 

Я называю эту большую часть данных через AJAX, как я могу защитить ее от злых пользователей, которые могут попытаться сделать прямые POST-вызовы на эту страницу?

Редактировать: @Bainternet Спасибо за подробное объяснение, оцените это, но мой вопрос действительно о том, что сказал @Milo, и я могу видеть, что, если я не могу создать уникальный nonce для этого запроса, я не могу ничего сделать по @goldenapples. Правильно?

Я обрабатываю все это с помощью Facebook JS SDK, поэтому все, что нужно сделать, – это только AJAX (без загрузки страницы), и что бы я ни думал о том, чтобы заставить пользователя wp_signon() в wp_signon() или что-то еще, кто-то еще может это сделать тоже без полномочий. Таким образом, у меня нет уникальности для пользователя, который на самом деле использует этот сайт, и тот, кто пытается прочитать некоторые данные, кроме сайта, вызывает вызов для извлечения данных. И что бы я ни делал, чтобы войти в систему или что-то еще, это может быть реплицировано и кем-то другим. Может кто-нибудь что-то подумать?

Обновление: я думаю, что нашел обходное решение, просто называя его action и получая другие параметры из Facebook с помощью PHP SDK. Но я по-прежнему открыт для предложений или чего-то еще в этом отношении.

Есть несколько вещей, которые вы можете сделать, чтобы сделать более безопасными:

Сначала Ajax называет его сам должен быть сделан с WordPress nonce, как вы сказали:

 <script type="text/javascript" > jQuery(document).ready(function($) { var data = { action: 'ACTION_NAME', Whatever_data: 1234, _ajax_nonce: <?php echo wp_create_nonce( 'my_ajax_nonce' ); ?> }; $.post(ajaxurl, data, function(response) { alert('Got this from the server: ' + response); }); }); </script> 

В приведенном выше коде _ajax_nonce два атрибута action и _ajax_nonce которые оба необходимы для проверки вызова admin-ajax.php, в первых нескольких строках кода он проверяет, было ли отправлено действие на сервер, а если нет, то он die() ( FIRST CHECK ), то с помощью этого действия вы с помощью крюка действия вы вызываете свою собственную функцию ajax:

 //if you want only logged in users to access this function use this hook add_action('wp_ajax_ACTION_NAME', 'my_AJAX_processing_function'); //if you want none logged in users to access this function use this hook add_action('wp_ajax_nopriv_ACTION_NAME', 'my_AJAX_processing_function'); 

и если вы хотите, чтобы оба пользователя вошли в систему, и ни один из зарегистрированных пользователей не имел доступа к этой функции, используйте оба крючка (SECOND CHECK).

то в вашей функции ajax первое, что вам нужно сделать, это проверить для ajax referrer (THIRD CHECK):

 function my_AJAX_processing_function(){ check_ajax_referer('my_ajax_nonce'); //do stuff here } 

затем при запуске запросов в базе данных с пользовательским вводом вы должны использовать $wpdb->prepare для экранирования и проверки, чтобы вместо:

 $query = "SELECT `id` FROM table WHERE `user_id` = $myid;"; $data = $wpdb->get_col( $query ) 

использовать:

 $data = $wpdb->query( $wpdb->prepare("SELECT `id` FROM table WHERE `user_id` = %d",$myid)); 

Я не совсем уверен, насколько это безопасно, но обработчики WordPress Ajax являются пользователями (я предполагаю, что запрос по-прежнему запрашивает, чтобы файлы cookie были проверены, и если пользователь зарегистрирован в учетной записи). Таким образом, вы можете сделать обычную проверку current_user_can() .

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