Друпал Аякс:Передача значений по URL-адресу и параметру данных

StackOverflow https://stackoverflow.com/questions/2144983

  •  23-09-2019
  •  | 
  •  

Вопрос

В чем разница между использованием:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get/' + node,
  dataType: 'json',
  data: { 'ajax' : true }
 });

против:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get',
  dataType: 'json',
  data: { 'ajax' : true, 'node' : node }
 });

В первом случае вы получите доступ к переменной узла в качестве параметра функции обратного вызова, а во втором случае вы получите доступ к ней с помощью $_POST['node'], верно?Разве второй метод не всегда был бы лучше, но я вижу, что многие люди делают это первым способом.Нельзя сказать, что второй способ настолько безопасен.Все еще изучаю токены форм, но сначала пытаюсь разобраться в этом базовом моменте.

Также интересно для случая 1, если предположить, что этот ajax запускается кнопкой, как помешать человеку войти непосредственно в URL-адрес mysite/module/get/20 и активировать его?Делает ли это простая проверка $_POST['ajax'] == true?Или там еще есть дыра в безопасности?

Это было полезно?

Решение

Никакой разницы на первый взгляд:

Если предположить, что ваша переменная node — это просто идентификатор узла, между ними нет большой разницы.Семантически оба, похоже, выполняют операцию «получить» (хотя технически это почтовые запросы), поскольку они просто извлекают данные, не меняя никакого состояния на сервере (хорошо, это еще одно предположение).

С точки зрения безопасности, существенной разницы также нет — оба можно легко «подделать», и разница сводится к тому же, что и в случае «стандартного» GET и GET.POST-дебаты, то есть, никакой разницы, за исключением того, что первый предоставляет параметры немного более «доступными» для случайного наблюдателя, поскольку они находятся на виду в URL-адресе.

Но разница в «удобстве» внутри Drupal:

В Drupal часто встречается первая версия, поскольку она может использовать Аргументы загрузчика подстановочных знаков функциональность (представленная в Drupal 6).Допустим, ваш URL-адрес обратного вызова определен вook_menu следующим образом:

$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);

С этим, yourModule_callback() будет вызван с его первым параметром, уже являющимся полностью загруженным объектом узла для переданного в nid, как %node сообщает Drupal выполнить node_load() на параметре перед передачей его функции обратного вызова.Используя вторую версию вашего примера, функция обратного вызова должна будет загрузить сам объект узла после его извлечения из данных POST.

Так что тут удобство.

Кроме того, в Drupal обычно используется тот же URL-адрес обратного вызова для запроса AJAX, что и для его «резервной» альтернативы, не связанной с javascript.Так когда yourModule_callback() вызывается, он может делать все, что предназначено, с переданным узлом в первую очередь, в основном собирая свой результат.После этого он проверяет только $ajax == TRUE внутри данных POST.Если он есть, он знает, что результат предназначен для запроса AJAX, поэтому может вывести результат в формате JSON.Если его там нет, он знает, что происходит полный цикл страницы, и может соответствующим образом скорректировать свой вывод (например,перестроение формы, восстановление целой страницы, да что угодно...).

Таким образом, вам не нужно регистрировать отдельные URL-адреса для обратных вызовов, отличных от AJAX/AJAX.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top