Loading...

الأمان · قراءة 9 دقائق

الروابط الموقَّعة: روابط تتوقف عن العمل

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

آخر تحديث

الروابط الموقَّعة: روابط تتوقف عن العمل

ما الذي يعد به الرابط الموقَّع فعليًا

ثلاثة أشياء، ويستحق الدقة لأن الناس يتوقعون رابعًا.

يُثبت أن الرابط صادر منك. التوقيع هو تجزئة (hash) للمسار، وانتهاء الصلاحية، وسر لا يعرفه سوى خادمك. لا أحد يستطيع تلفيق رابط عامل بلا السر.

ينتهي. انتهاء الصلاحية جزء مما يُوقَّع، فلا يمكن تعديله دون كسر التوقيع.

يُفحَص قبل أن يُلمَس أصلك. عند حافة CDN، يُرفض الطلب غير الموقَّع عند الحافة؛ خادمك لا يراه أبدًا.

ما لا يعد به: أن من يفتح الرابط لن يحفظ الملف ويرسله بالبريد الإلكتروني لصديق. الرابط الموقَّع يتحكم في الوصول إلى الرابط، لا في البايتات. إن احتجت تحكمًا بعد التنزيل، فأنت تبحث عن DRM، وهو منتج مختلف وأثقل بكثير.

عائلتان: توقيعات الحافة والروابط الموقَّعة مسبقًا

توقيعات المسار عند الحافة — ما يمنحك إياه CDN. تطبيقك يحسب توقيعًا لمسار وانتهاء صلاحية؛ والحافة تتحقق منه عند الوصول. الملف يمكن أن يعيش في أي مكان يستطيع CDN الوصول إليه، والفحص يحدث قريبًا من الزائر.

الروابط الموقَّعة مسبقًا من تخزين الكائنات — ما يمنحك إياه S3 والتخزين المتوافق معه. خدمة التخزين نفسها تُصدر رابطًا مؤقتًا، موقَّعًا بمفتاح الوصول الخاص بك، صالحًا عادةً لدقائق. التوقيع يسافر في سلسلة الاستعلام كـ X-Amz-Signature وأخواتها.

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

كيف يعمل على cdn.com.tr

إنه إعداد على قاعدة توصيل، فيمكنك حماية /downloads بينما يبقى بقية الموقع عامًا. فعّل الروابط منتهية الصلاحية لتلك القاعدة، واضبط سرًّا، وولّد الروابط في تطبيقك.

التوقيع هو صيغة base64url للـ MD5 الخام لثلاثة أشياء مجموعة معًا: انتهاء الصلاحية، والمسار، والسر مسبوقًا بمسافة واحدة.

``` $uri = "/downloads/report.pdf"; $expires = time() + 600; // ten minutes $secret = "your-long-random-secret";

$token = rtrim(strtr(base64_encode( md5($expires . $uri . " " . $secret, true) ), "+/", "-_"), "=");

$url = "https://cdn.example.com{$uri}?md5={$token}&expires={$expires}"; ```

ثلاث نتائج، ومتعمَّد أن تكون متمايزة كي تستطيع سجلاتك التمييز بينها:

| الطلب | الاستجابة | |---|---| | توقيع صالح، لم تنتهِ الصلاحية | الملف، مخزَّن مؤقتًا بشكل طبيعي | | لا توقيع، أو توقيع خاطئ | 403 | | توقيع صحيح، الصلاحية منقضية | 410 |

الـ 410 أهم مما تبدو عليه. حين يقول عميل "رابطك معطوب"، رمز الحالة وحده يخبرك ما إذا أُرسل إليه رابط سيئ أو أنه انتظر طويلًا فقط — دون أن تسأله عن أي شيء.

فخ التخزين المؤقت الذي يكلّفك CDN

هذا هو الجزء المفقود من معظم التوثيقات، وهو الذي يؤلم.

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

الإصلاح إعداد واحد. على قاعدة التوصيل، اضبط وضع سلسلة الاستعلام كي لا تدخل معاملات التوقيع في مفتاح التخزين المؤقت:

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

تحقق من ذلك لاحقًا بدل الافتراض: اطلب الملف نفسه مرتين بتوقيعين صالحين مختلفين وانظر إلى ترويسة حالة التخزين المؤقت. الطلب الثاني ينبغي أن يكون إصابة. إن كان كلاهما تفويتًا، فالمفتاح ما زال يحتوي التوقيع.

اختيار انتهاء الصلاحية

قصير بما يكفي كي يكون الرابط المسرَّب عديم القيمة؛ وطويل بما يكفي كي ينتهي التنزيل على اتصال سيئ.

المستندات والصور: من خمس إلى خمس عشرة دقيقة. تُجلَب فور النقر.

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

بيانات التشغيل التدفقي (manifests) تحتاج عناية. مع HLS، يجلب المشغّل ملف manifest ثم مقاطع كثيرة طوال مدة التشغيل. إن وقّعت كل مقطع بانتهاء صلاحية قصير، ينقطع التشغيل في منتصف فيديو طويل. وقّع بانتهاء صلاحية يغطي الجلسة كاملة، أو وقّع ملف manifest واترك المقاطع محمية بضابط مختلف.

شيء واحد لا يمكنك فعله هو إبطال رابط واحد صادر بمفرده. إنه صالح حتى انتهاء صلاحيته، لا أكثر. إن احتجت إبطالًا فوريًا، دوّر السر — ما يُبطل كل رابط أصدرته.

الأخطاء التي تُسرّب السر

التوقيع في المتصفح. إن كان السر في JavaScript، فهو علني. التوقيع مكانه الخادم، دائمًا. يبدو هذا بديهيًا وهو أكثر طريقة شيوعًا تهرب بها الأسرار.

خبز الروابط وقت البناء. رابط يُولَّد أثناء بناء ثابت (static) يحمل انتهاء صلاحية مضبوطًا وقت البناء، وينتهي بينما الصفحة ما زالت حية. ولّد وقت الطلب، أو عبر نقطة نهاية صغيرة تُعيد التوجيه.

انحراف الساعة. انتهاء الصلاحية يُقارَن بساعة الحافة. إن كان خادم تطبيقك متأخرًا بدقائق، تولد الروابط منتهية الصلاحية أصلًا. أبقِ NTP يعمل؛ وحين يفشل رابط فور إصداره، تحقق من الساعة قبل الشيفرة.

وضع السر في مستودع. عامله كبيانات اعتماد: متغير بيئة، لا نظام تحكم إصدارات. حين يغادر أحدهم الفريق، دوّره.

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

الأسئلة الشائعة حول الروابط الموقَّعة

ما الفرق بين الرابط الموقَّع والرابط الموقَّع مسبقًا؟

الفرق غالبًا أين يحدث الفحص. "presigned URL" هو مصطلح S3 لرابط مؤقت تُصدره خدمة التخزين وتتحقق منه هي نفسها. أما الرابط الموقَّع عند حافة CDN فيُتحقَّق منه عند الحافة، قريبًا من الزائر، ويعمل لأي أصل لا لـ bucket فقط. المفهوم نفسه: توقيع زائد انتهاء صلاحية في سلسلة الاستعلام.

هل يمكن لأحد مشاركة رابط موقَّع؟

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

هل يضر التوقيع بالتخزين المؤقت؟

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

هل يمكنني إبطال رابط واحد؟

ليس بمفرده. التوقيع صالح حتى انتهاء صلاحيته لأن التحقق عديم الحالة (stateless) — لا توجد قائمة لإزالته منها. الضوابط المتاحة هي انتهاء صلاحية قصير وتدوير السر، ما يُبطل كل شيء دفعة واحدة.

ألا يُعد MD5 مكسورًا لهذا الغرض؟

MD5 مكسور من ناحية مقاومة التصادم، وهذا مهم حين يستطيع المهاجم اختيار كلتا الرسالتين. هنا يجب على المهاجم تزوير تجزئة لسلسلة تحتوي سرًّا لا يملكه، وهذه مشكلة "صورة أولية" (preimage) لا تصادم. الخطر العملي هو تسرب السر أو كونه قابلًا للتخمين — استخدم سرًّا عشوائيًا طويلًا، وأبقه على الخادم، ودوّره.

هل ينبغي أن أستخدم هذا لفيديو HLS؟

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