سؤال

ما هو الفرق بين استخدام:

 $.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'] == صحيح هل تفعل ذلك؟ أم أنه لا يزال هناك ثقب أمني هناك؟

هل كانت مفيدة؟

المحلول

لا يوجد فرق حقيقي من النظرة الأولى:

على افتراض أن متغير "العقدة" الخاص بك هو مجرد معرف عقدة ، لا يوجد فرق كبير بين الاثنين. من الناحية الدلالية ، يبدو أن كلاهما يؤدي عملية "الحصول على" (على الرغم من أنهما تم نشرهم تقنيًا) ، حيث يسترجعان البيانات فقط دون تغيير أي حالة على الخادم (حسنًا ، هذا افتراض آخر).

من الحكمة الأمنية ، لا يوجد اختلاف ذي صلة أيضًا - يمكن أن يكون كلاهما "مزورًا" بسهولة ، ويغتل الفرق في نفس الشيء كما هو الحال مع "Get Of Post Standard" ، أي لا يوجد فرق إلا أن الأول يعرض المعلمات أ Wee أكثر قليلاً "يمكن الوصول إليها" للمراقب غير الرسمي ، لأنها في مرأى من عنوان URL.

لكن اختلاف "الراحة" داخل دروبال:

داخل دروبال ، غالبًا ما يتم مواجهة الإصدار الأول لأنه يمكن أن يستفيد من حجج اللودر البرية الوظيفة (التي تم تقديمها في دروبال 6). دعنا نقول أن عنوان URL لاستدعاءك محدد في Hook_Menu مثل ذلك:

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

مع هذا، yourModule_callback() سيتم استدعاؤه مع المعلمة الأولى لها بالفعل هو Obect العقدة المحملة بالكامل للمرور في NID ، مثل %node يخبر دروبال بتنفيذ أ node_load() على المعلمة قبل تسليمها إلى وظيفة رد الاتصال. باستخدام الإصدار الثاني من مثالك ، يجب على وظيفة رد الاتصال تحميل كائن العقدة نفسه ، بعد استخراجه من بيانات المنشور.

لذلك شيء من الراحة هنا.

بالإضافة إلى ذلك ، فإن النمط الشائع داخل Drupal هو استخدام عنوان URL للاتصال نفسه لطلب AJAX كما هو الحال بالنسبة إلى بديل JavaScript 'Fackback'. اذن متى yourModule_callback() يتم استدعاؤه ، يمكن أن يفعل كل ما هو المقصود مع تمريره في العقدة أولاً ، وتجميع نتائجها بشكل أساسي. بعد ذلك ، يتحقق فقط $ajax == TRUE ضمن بيانات البريد. إذا كان هناك ، فهذا يعلم أن النتيجة مخصصة لطلب AJAX ، لذلك قد يخرج النتيجة كـ JSON. إذا لم يكن هناك ، فهذا يعلم أن دورة الصفحة الكاملة مستمرة ، ويمكنها ضبط إخراجها وفقًا لذلك (على سبيل المثال إعادة بناء نموذج ، وتجديد صفحة كاملة ، أيا كان ...).

وبهذه الطريقة ، ليس عليك تسجيل عناوين URL منفصلة لاتخاذ عمليات الاسترداد غير AJAX/AJAX.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top