معمار الأمان

أساسيات أمان يجب أن يطبقها كل Telegram Mini App

إطلاق mini app سهل، لكن دين الأمان يكبر بسرعة إذا كانت البنية ضعيفة.

الأمان في الألعاب ليس طبقة واحدة بل منظومة تجمع التحقق من الهوية وحداثة الطلب واكتشاف الإساءة.

بناء خط أمان واضح يقلل الحوادث القابلة للتفادي ويبقي تكاليف الدعم تحت السيطرة.

العمليات المرتبطة بالهوية

العمليات الحساسة يجب أن تستمد هوية اللاعب من سياق تيليغرام المُتحقق منه، لا من المعرّفات التي يقدمها المستخدم في أجسام الطلبات أو معاملات الاستعلام. حين يرسل العميل طلب إجراء، يجب على الخادم استخراج معرّف اللاعب من حمولة initData الموقّعة تشفيرياً التي يوفرها تيليغرام — والتحقق من تلك التوقيع باستخدام الرمز المميز للبوت قبل الثقة بأي ادعاء بداخلها. أي نظام يقرأ بدلاً من ذلك معرّف اللاعب من حقل يقدمه العميل يمكن انتحاله بسهولة من أي مستخدم يفهم كيفية عمل طلبات HTTP.

هذا النهج يحجب ناقلات انتحال الهوية الأكثر شيوعاً. لا يستطيع ممثل خبيث الادعاء بأنه لاعب آخر عن طريق تعديل حقل جسم الطلب إذا كان الخادم لا يقرأ الهوية من ذلك الحقل أبداً. المسارات المالية — طلبات السحب وقراءات الرصيد وائتمان الإحالة — يجب أن تعمل جميعاً على الهوية المستخرجة من الخادم حصراً. لحظة قبول أي عملية مالية لهوية يُؤكّدها العميل، يصبح الطبقة المالية بأكملها عرضة لهجمات استبدال الهوية.

نفّذ هذا على مستوى برمجية المصادقة الوسيطة حتى يُطبَّق النمط باتساق عبر جميع المسارات المحمية، بدلاً من الاعتماد على معالجات المسارات الفردية لتتذكر استخراج الهوية بشكل صحيح. البرمجية الوسيطة التي تتحقق من initData وتُرفق كائن المستخدم المُتحقَّق منه بسياق الطلب تجعل استخراج الهوية تلقائياً لكل معالج downstream. المسارات التي تتخطى البرمجية الوسيطة يجب تحديد نطاقها صراحةً للعمليات غير الحساسة فقط.

الحماية من إعادة التشغيل والتوقيت

استخدم نوافذ الطوابع الزمنية وفحوص nonce ومفاتيح الإدمتالية للعمليات القابلة للتعديل. نافذة الطابع الزمني ترفض الطلبات التي يكون فيها auth_date أقدم من حد مُهيَّأ — عادةً 300 إلى 600 ثانية. هذا يضمن أن حمولة initData الصالحة المُلتقطة من جلسة واحدة لا يمكن إعادة تشغيلها بعد ساعات أو أيام ضد نفس النقطة النهائية. بدون هذه النافذة، تظل حمولة المصادقة المسروقة قابلة للاستغلال إلى أجل غير مسمى.

فحوص Nonce تضيف طبقة ثانية بإلزام كل طلب بحمل معرّف فريد مُسجَّل لدى الخادم يمكن استخدامه مرة واحدة فقط. حين يعالج الخادم طلباً بـnonce معين، يسجّله كمُستهلَك. الطلبات اللاحقة التي تحمل نفس الـnonce تُرفض، بصرف النظر عن صلاحية الطابع الزمني. هذا يحمي من الحالة المحددة حيث يُلتقط طلب ضمن نافذة الطابع الزمني الصالحة ويُحاوَل تقديمه عدة مرات قبل انتهاء النافذة.

مفاتيح الإدمتالية هي الطبقة الثالثة، مصممة للعمليات القابلة للتعديل التي يجب أن تكتمل مرة واحدة بالضبط — ائتمانات المكافآت ومشتريات الترقية وتقديمات السحب. يُنشئ العميل مفتاحاً فريداً لكل محاولة إجراء ويرسله مع الطلب. يسجّل الخادم النتيجة مقابل المفتاح. إذا وصل نفس المفتاح مرة أخرى، يُعيد الخادم النتيجة المُسجَّلة دون إعادة تنفيذ العملية. هذا النمط يجعل السلوك الآمن للمحاولة الجديدة ممكناً للعملاء الأصليين مع منع التنفيذ المكرر من الطلبات الآلية أو المُعاد تشغيلها.

إغلاق آمن بشكل افتراضي

عندما يفشل التحقق يجب أن ترفض العمليات بأمان بدلاً من الاستمرار جزئياً. سلوك الفشل المفتوح — حيث يُلتقط فشل التحقق ويُسجَّل ثم تستمر العملية على أي حال — يخلق تناقضات صامتة مكلفة الاكتشاف والإصلاح. أخطر حالات الفشل المفتوح هي تلك التي لا تُسجّل الأخطاء بشكل مرئي، أو حيث يُعامَل فشل التحقق كتحذير غير حرج يُقلّل من أولويته فريق التطوير مع الوقت.

الإغلاق الآمن يعني أن العملية تُعيد خطأً واضحاً للعميل ولا تتخذ أي إجراء ذي تأثير على جانب الخادم حين لا يمكن تأكيد أي خطوة تحقق مطلوبة. إذا فشل التحقق من initData، أعِد خطأ مصادقة. إذا فشل فحص nonce، أعِد رفض إعادة التشغيل. إذا فشل البحث عن مفتاح الإدمتالية بسبب خطأ في طبقة البيانات، أعِد خطأ خدمة قابل للمحاولة بدلاً من المضي قدماً دون حماية التكرار. كل هذه الاستجابات قابلة للاسترداد من قِبَل عميل شرعي من خلال منطق إعادة المحاولة الطبيعي؛ لا أي منها ينتج حالة غير صحيحة.

طبّق الإغلاق الآمن في كل طبقة تحقق بشكل مستقل، لا فقط عند حدود المصادقة الخارجية. طلب يجتاز المصادقة لكنه يفشل في فحص تحديد المعدل الداخلي يجب رفضه. طلب يجتاز المصادقة وتحديد المعدل لكنه يفشل في فحص كفاية الرصيد يجب رفضه. تأليف سلوك الإغلاق الآمن عبر كل طبقة يضمن أن لا نقطة تجاوز واحدة تخلق مساراً لنتيجة غير صحيحة، بصرف النظر عن كيفية تطور التطبيق مع الوقت.

خلاصة عملية

التطبيقات المصغرة الآمنة تستمد هوية اللاعب من سياق تيليغرام المُتحقَّق منه فقط، وتحمي من إعادة التشغيل بنوافذ الطوابع الزمنية والـnonces، وتستخدم مفاتيح الإدمتالية للعمليات التي يجب أن تكتمل مرة واحدة بالضبط، وترفض بأمان حين يفشل أي خطوة تحقق. كل طبقة تعالج سطح هجوم محدداً، وبالمجمل يجعل الفجوة بين السلوك المقصود والسلوك القابل للاستغلال أصغر ما يمكن — وهذا في نهاية المطاف ما تهدف إليه معمارية الأمان.