نموذج تواصل لا يُسرّب
العمل الأمني الممل خلف ثلاثة حقول إدخال
نموذج التواصل أصغر ميزة ممكنة بسطح هجوم حقيقي. يأخذ مدخلات غير موثوقة، ويضعها في بريد، ويرسل ذلك البريد إلى مكان سأقرأه. ثلاثة حقول، ونقطة نهاية واحدة، وعدة طرق للخطأ لم أجدها إلا حين عدت ونظرت كما ينبغي.
01تحقّق على الجانبين، لسببين مختلفين
هناك تحقّق من جهة العميل وتحقّق من جهة الخادم وهما ليسا المهمة نفسها. تحقّق العميل موجود ليعرف الزائر بعنوان بريد مشوّه وهو ما يزال ينظر إلى الحقل، لا بعد رحلة ذهاب وإياب. إنه ميزة تجربة استخدام ولا قيمة أمنية له إطلاقاً، لأن بإمكان أي أحد أن يرسل مباشرة إلى نقطة النهاية ويتخطى النموذج كلياً. أما تحقّق الخادم فهو الذي يهم، وعليه أن يفترض أن الطلب لم يأتِ من نموذجي. أستعمل تعريف المخطط نفسه على الجانبين كي لا تنحرف القواعد، وهو أحد المكاسب الحقيقية لمشاركة لغة واحدة عبر الطبقات، لكن الجزء المهم أن الخادم يحلّل ولا يثق. يرفض كل ما لا يطابق الشكل ويعيد خطأ تحقّق، ولا يرى المعالج تحته قيمة لم يفحصها. إعادة استعمال المخطط راحة. أما تشغيله على الخادم فمتطلب، وكون الشيفرة تبدو متطابقة يخفي مدى اختلاف الدور الذي تؤديه كل منهما.
02العلة التي كانت عندي فعلاً
كان معالجي يبني بريداً بصيغة HTML بإدراج الاسم والرسالة المُرسَلين مباشرة في نص قالبي. هذا حقن، وهو العلة نفسها التي تنشأ من وضع مدخلات غير مهرَّبة في صفحة، فقط مع عميل بريد بوصفه المُصيِّر بدل المتصفح. رسالة تحتوي ترميزاً كانت ستُعرض بوصفها ترميزاً في أي برنامج أقرأ به بريدي. إنها نسخة أدنى خطورة من مشكلة الويب لأن الجمهور أنا لا كل زائر، لكن المنطق الذي جعلها تبدو مقبولة هو المنطق نفسه الذي ينتج ثغرات حقيقية في مواضع أخرى، فاستحقت إصلاحاً صحيحاً بدل تبرير. والعلاج تهريب المحارف الخمسة المهمة في HTML قبل الإدراج، وهو بضعة أسطر ودون أي اعتمادية. والعلاج الأفضل إرسال بديل نصي صرف أيضاً، بما أن المحتوى ثلاثة حقول ولا يكسب شيئاً من الترميز. وما جعل هذا يستحق الكتابة عنه هو كيفية حدوثه. لم يكن خطأً صعباً ولا واجهة غير مألوفة. كان نصاً قالبياً في ملف بدا أصغر من أن يُراجَع.
03تحديد المعدّل والتكاليف الصامتة
نقطة إرسال غير محمية هي مُرحِّل بريد مجاني موجّه إلى صندوقي، وتعرف ذلك حين تصل بضع مئات من الرسائل في ليلة. تحديد المعدّل هو العلاج، والقيد العملي هو أين تخزّن العدّاد. التخزين في الذاكرة يعمل على خادم واحد طويل العمر ويفشل بصمت في البيئات عديمة الخوادم، حيث تحصل كل نسخة على ذاكرتها الخاصة فيصير الحد لكل نسخة لا لكل زائر. وهذا الفشل غير مرئي في الاختبار، لأن في الاختبار نسخة واحدة. المخزن المشترك هو الجواب الصحيح. وحقل الطُعم يستحق العشر دقائق التي يكلّفها: حقل مخفي لا يملؤه البشر أبداً وتملؤه الروبوتات الساذجة في كل مرة، فيُرفض على الخادم. إنه يوقف نسبة مفاجئة من الحركة الآلية مقابل لا شيء تقريباً، وبخلاف أدوات التحدّي لا يكلّف الزائر الشرعي شيئاً على الإطلاق. والتكلفة الصامتة الأخرى هي عنوان المُرسِل. الإرسال من نطاق التهيئة المشترك التابع للمزوّد يعمل في التطوير ويهبط في مجلد الرسائل المزعجة في الإنتاج، وضبط نطاق الإرسال كما ينبغي هو الفرق بين نموذج تواصل ونموذج تواصل يصلك.
04الفشل دون قول أكثر مما ينبغي
القطعة الأخيرة هي ما تقوله نقطة النهاية حين يسوء شيء. الغريزة أن تكون مفيداً فتعيد الخطأ الأصلي، وهذه الغريزة تُسرّب. خطأ المزوّد قد يحمل معرّف حساب، أو تفصيل حد معدّل، أو مسار تتبّع يصف بنية نشري. لا شيء من ذلك يفيد من ملأ النموذج، وكله يفيد من يستكشف نقطة النهاية. لذا فالاستجابة رسالة فشل عامة، ويذهب الخطأ الحقيقي إلى سجلات الخادم حيث أستطيع قراءته. والنصف الآخر ألا تكذب في الاتجاه المعاكس. إن فشل الإرسال فعلى النموذج أن يقول ذلك، لأن رسالة نجاح على إرسال فاشل تعني أن أحدهم يظن أنه راسلني وينتظر رداً لن أرسله أبداً. وهذا أسوأ من الخطأ، لأن الخطأ يدفعه على الأقل لتجربة قناة أخرى. إذن: صادق في ما إذا نجح، صامت في سبب فشله.
الخلاصة
لا شيء من هذا صعب، وكله سهل التخطي، لأن نموذج التواصل يبدو أصغر من أن يستحق مراجعة أمنية. حلّل المدخلات على الخادم، وهرّب كل ما تدرجه، وحدّد المعدّل بمخزن ينجو من نموذج نشرك، وأعد أخطاءً صادقة في النتيجة دون أن تصف بنيتك التحتية.