كيف تعمل الروابط السرية في LinkPilot
مرجع بلغة واضحة يشرح كيف يُخزَّن محتوى الأسرار وكيف يُظهَر وكيف يُحذف نهائيًا، وما لا نفعله به عن قصد.
الروابط السرية خاصة بحكم تصميمها. يفصل LinkPilot مشاركة الأسرار عن إحصاءات روابط التسويق، ولا يُستخدم محتوى الأسرار أبدًا في الإحصاءات أو في بناء ملفات تعريف للأشخاص.
وجدت ثغرة أو رابطًا مسيئًا؟ أبلغ عنه هنا، فالبلاغات تصل إلى الفريق مباشرة.
1. نظرة عامة
يشغّل LinkPilot مسارين منفصلين للروابط على المنصة نفسها: الروابط الذكية، وهي روابط مختصرة بنطاقك الخاص مع إحصاءات النقرات، والروابط السرية لتسليم المحتوى الحساس مرة واحدة بصلاحية محدودة وبحماية عبارة مرور. ونفصل بينهما على مستوى البيانات ومسارات الشيفرة والمنتج، فلا يمكن أن يتسرب محتوى الأسرار إلى لوحات الإحصاءات أو إلى تصدير مجموعات البيانات أو إلى ميزات الذكاء الاصطناعي.
تتناول هذه الصفحة مسار الروابط السرية تحديدًا: كيف يُنشأ السر، وكيف يُظهَر، وما يحدث بعد مشاهدته، وما البيانات الوصفية التي تُسجَّل في كل خطوة.
2. كيف تعمل الروابط السرية
- ينشئ المرسل السر، وله أن يضيف عبارة مرور ومدة صلاحية وحدًا لعدد المشاهدات يُحذف السر بعده نهائيًا.
- يشفّر متصفح المرسل المحتوى قبل إرسال أي شيء. وما يصل إلينا نص مشفر يُكتب في جدول مخصص هو
secret_links، معزول عن جداول إحصاءات النقرات. - يعيد LinkPilot رابطًا مختصرًا (مثل
shrd.link/s/<slug>#k=<key>) لترسله إلى المستلم. والجزء الذي يلي علامة#هو مفتاح فك التشفير، ويُولَّد في متصفح المرسل ولا يُرسل إلينا أبدًا، فلا نستطيع إعادة إنشاء هذا الرابط لاحقًا. - عندما يفتح المستلم الرابط، يستدعي التطبيق دالة الحافة
secret-reveal. يعيد طلبGETالبيانات الوصفية فقط (الحالة، وهل تلزم عبارة مرور)، أما النص المشفر فلا يعيده إلا طلبPOSTيحمل عبارة المرور. ثم يفك متصفح المستلم تشفيره بالمفتاح الموجود في آخر الرابط. ودالة الإظهار نفسها لا تفك تشفير أي شيء، ولا تستطيع ذلك لو أرادت. - يُسجَّل الإظهار الناجح في عملية ذرية واحدة، وقد تتغير حالة السر فورًا إلى
burnedبحسب إعداد الحذف بعد عدد المشاهدات.
3. نموذج التشفير
نريد الدقة هنا، لأن كلمتي «مشفر» و«المعرفة الصفرية» كثيرًا ما تُستخدمان بتساهل.
- أثناء النقل: كل حركة البيانات مشفرة ببروتوكول TLS من طرف إلى طرف بين المستلم وخوادم الحافة لدينا وقاعدة بياناتنا المُدارة.
- في متصفحك، قبل النقل: منذ 29 سبتمبر 2026 يُشفَّر المحتوى على جهاز المستخدم بخوارزمية AES-GCM-256 بمفتاح طوله 256 بت يُولَّد في متصفحك. نخزن النص المشفر ولا شيء غيره. وينتقل المفتاح في جزء رابط المشاركة الذي يلي علامة
#، والمتصفحات لا ترسل هذا الجزء إلى أي خادم، لا إلينا ولا إلى Cloudflare التي تقدّم صفحة الإظهار. - أثناء التخزين: يُحفظ النص المشفر في عمود مفصول منطقيًا عن بيانات الإحصاءات، على نسخة Postgres مُدارة مشفرة أيضًا على مستوى القرص.
- عبارات المرور: عندما تضع عبارة مرور، تُحوَّل إلى صيغة Unicode قياسية (NFKC)، فتعطي العبارة نفسها المفتاح نفسه ولو كُتبت بلوحة مفاتيح أو طريقة إدخال مختلفة. ثم تُقوّى بخوارزمية PBKDF2-SHA256 (210,000 تكرار) وتُدمج مع مفتاح الرابط عبر HKDF-SHA256، فلا يكفي الرابط وحده ولا عبارة المرور وحدها لفك تشفير السر. وإلى جانب ذلك تُرسل تجزئة SHA-256 لعبارة المرور، ليتمكن الخادم من رفض إعادة النص المشفر أصلًا لمن لا يعرفها. ولا تُكتب عبارة المرور بنصها الأصلي في قاعدة بياناتنا ولا في سجلاتنا أبدًا.
- ما يحميه هذا وما لا يحميه: يُخرجنا هذا التصميم، ومعنا قاعدة بياناتنا وخوادم الحافة، من دائرة الثقة. لكنه لا يحمي سرًا أُعيد إرسال رابطه كاملًا، أو التُقطت له صورة شاشة، أو سجّله شيء ما على جهة المستلم، لأن الرابط يحمل المفتاح.
- الاستثناءان، بوضوح: الأسرار المنشأة قبل 29 سبتمبر 2026 مخزنة نصًا غير مشفر. لا نعيد كتابتها في الخفاء، وتبقى تعمل كما كانت تمامًا، وتختفي مع انتهاء صلاحيتها. والمرفقات تُشفَّر في المتصفح أيضًا بمفتاح مشتق من مفتاح السر نفسه، فيفتح رابط واحد الاثنين معًا ولا نملك مفتاحًا لأي منهما. لكننا ما زلنا نرى اسم الملف وحجمه ونوعه، فهذه أعمدة بيانات وصفية وليست محتوى. أما المرفقات المرفوعة قبل 29 سبتمبر 2026 فما زالت مخزنة ملفات غير مشفرة.
والنتيجة العملية تستحق التوضيح: لأننا لا نملك المفتاح أبدًا، لا نستطيع استرجاع سر لك. وإذا ضاع رابط المشاركة، ضاع المحتوى معه.
تحقق بنفسك. لا تحتاج إلى أن تأخذ التشفير في المتصفح على الثقة. شيفرة التشفير نفسها موجودة في مستودع linkpilot-cli مفتوح المصدر (بترخيص MIT)، وفيه CLI و SDK للغة TypeScript وخادم MCP. ويضم المستودع متجهات الاختبار التي يُفحص بها تطبيق الويب، فتستطيع قراءة طريقة اشتقاق المفتاح وتشغيل المتجهات والتأكد من أن ما يغادر الجهاز نص مشفر وأن المفتاح لا يذهب إلا إلى آخر الرابط بعد علامة #. وإذا وجدت فرقًا بين تلك الشيفرة وهذه الصفحة، أبلغنا به.
4. ما يحدث بعد مشاهدة السر
- تُسجَّل المشاهدة في عملية ذرية عبر دالة في قاعدة البيانات، فلا يمكن لمحاولات إظهار متزامنة أن تسرّب السر مرتين.
- إذا بلغ عدد المشاهدات الحد المضبوط، تتغير حالة السر إلى
burnedويُكتب[REDACTED]فوق المحتوى المخزن. - وأي محاولة إظهار بعد ذلك تعيد ردًا واضحًا بأن السر «فُتح سابقًا وحُذف نهائيًا» مع رمز HTTP 410.
- يدوّن سجل التدقيق كل مشاهدة وكل حذف نهائي وكل إبطال مع تجزئة عنوان IP، وهذا يفيد في الاستجابة للحوادث وفي تغيير بيانات الدخول.
5. انتهاء الصلاحية والإبطال
- يمكن أن تحدد لكل سر مدة صلاحية: 1 ساعة أو 24 ساعة أو 7 أيام في أي خطة، أو تاريخًا ووقتًا مخصصين في خطة Pro، مع حد اختياري لعدد المشاهدات.
- تتغير حالة السر المنتهي إلى
expiredعند أول وصول تالٍ، ويُمحى المحتوى في عملية الكتابة نفسها. - يستطيع المالك إبطال السر يدويًا في أي وقت من لوحة التحكم. والسر المُبطل يرفض الإظهار فورًا ويعيد رمز HTTP 410.
- بعد أن يُحذف السر نهائيًا أو تنتهي صلاحيته أو يُبطل، لا يمكن استرجاع محتواه عبر المنتج. فلا يوجد إجراء «للتراجع عن الإبطال» ولا «للاستعادة»، وهذا مقصود في التصميم.
6. الحماية بعبارة مرور
- عبارة المرور اختيارية، لكننا ننصح بها لأي سر لا تريد أن يستهلكه شخص عابر يفتح الرابط.
- تُحسب تجزئة SHA-256 لعبارة المرور في المتصفح، وتُرسل عبر TLS، ويقارن الخادم بين التجزئتين. ولا تصل القيمة الأصلية إلى قاعدة بياناتنا أبدًا.
- لا نسمح بأكثر من 5 محاولات لعبارة المرور لكل عنوان IP في الدقيقة لكل سر، ونطبّق هذا الحد بمحدِّد في الذاكرة وبنافذة منزلقة مخزنة في قاعدة البيانات.
- تُكتب كل محاولة فاشلة في سجل التدقيق مع تجزئة عنوان IP، ليرى مالكو مساحة العمل أي نشاط مريب.
- ننصح بإرسال عبارة المرور عبر قناة غير التي ترسل بها الرابط، كأن ترسل الرابط بالبريد الإلكتروني وعبارة المرور برسالة خاصة في Slack أو برسالة SMS.
7. الحماية من فاحصات الروابط وروبوتات المعاينة
فاحصات الأمان في البريد الإلكتروني وأدوات معاينة الروابط في تطبيقات المحادثة (Slack و LinkedIn و iMessage و Outlook) تجلب الروابط عادة بمجرد ظهورها. ومع رابط يُحذف بعد القراءة، كان التصميم الساذج سيعني أن أول معاينة تحذف السر نهائيًا قبل أن يراه المستلم.
ويمنع LinkPilot ذلك بثلاث طرق:
- نقطتا وصول منفصلتان للبيانات الوصفية وللإظهار. طلب
GETإلى نقطة الإظهار لا يعيد إلا الحالة وما إذا كانت عبارة المرور مطلوبة. ولا تُسجَّل المشاهدة إلا بطلب إظهار صريح من نوعPOST، وهو ما يحدث حين يضغط إنسان زر الإظهار. - بوابة عبارة المرور. عند ضبط عبارة مرور، لا يُعاد المحتوى لأحد، روبوتًا كان أو إنسانًا، دون التجزئة الصحيحة.
- Cache-Control: no-store في كل رد إظهار، فلا تخزّن الخوادم الوسيطة محتوى الأسرار.
8. البيانات الوصفية التي نسجلها
في كل محاولة إظهار لا نسجل إلا ما يلزم ليحصل مالكو مساحة العمل على سجل تدقيق موثوق:
- وقت المحاولة.
- تجزئة عنوان IP: قيمة SHA-256 لعنوان IP الذي جاء منه الطلب مع ملح يتغير يوميًا، مقتطعة إلى 32 حرفًا. ولا نخزن عنوان IP الأصلي أبدًا.
- موقع جغرافي تقريبي (البلد والمدينة) من خوادم الحافة، إذا وفّره المزود.
- سلسلة User-Agent التي يرسلها المتصفح.
- نوع الحدث: إنشاء، مشاهدة، عبارة مرور خاطئة، حذف نهائي، انتهاء الصلاحية، إبطال.
لا نسجل محتوى السر، ولا عبارة المرور الأصلية، ولا عنوان IP الأصلي، ولا ملفات تعريف الارتباط على جهاز المستلم (فلا توجد أي منها)، ولا أي بكسلات تتبع من جهات خارجية.
9. الفرق بين الروابط السرية وروابط الإحصاءات
| الجانب | الروابط الذكية (إحصاءات) | الروابط السرية |
|---|---|---|
| الغرض | روابط مختصرة بنطاقك الخاص مع تتبع النقرات | تسليم آمن لمرة واحدة بصلاحية محدودة |
| التخزين | الروابط + أحداث النقر | نص مشفر في جدول secret_links معزول، يُمحى عند الحذف النهائي |
| بيانات كل نقرة | تجزئة عنوان IP والمصدر المُحيل و UA والموقع الجغرافي و UTM | تجزئة عنوان IP و UA والموقع الجغرافي ونوع الحدث، دون المحتوى |
| الاستخدام في الإحصاءات أو الذكاء الاصطناعي | نعم (مجمّعة ومجزّأة) | أبدًا، مستبعدة تمامًا |
| مدة البقاء | تبقى حتى تحذفها | تُحذف نهائيًا أو تنتهي صلاحيتها أو تُبطل، ثم لا يمكن استرجاع المحتوى |
| معاينات الروبوتات | تُحتسب زيارات روبوت وتُستبعد من الإحصاءات | طلب GET يعيد البيانات الوصفية فقط، فلا تستطيع الروبوتات إظهار السر |
يشترك المساران في العلامة التجارية ولوحة التحكم وأدوات إدارة الفريق نفسها، لكن البيانات لا تنتقل من أحدهما إلى الآخر.
10. المرفقات
- تُشفَّر الملفات في المتصفح بمفتاح مشتق من مفتاح السر نفسه، فيفتح رابط واحد النص والملف معًا.
- تُقدَّم عبر روابط موقّعة قصيرة العمر، وتخضع لعبارة المرور وانتهاء الصلاحية والحذف النهائي كما يخضع لها النص.
- يبقى اسم الملف وحجمه ونوعه مرئية لنا بصفتها بيانات وصفية، أما محتواه فلا.
- المرفقات المرفوعة قبل 29 سبتمبر 2026 تبقى مخزنة ملفات غير مشفرة حتى تنتهي صلاحيتها، ولا نعيد كتابتها أبدًا.
11. الاحتفاظ بالبيانات
- نكتب فوق محتوى السر عندما يُحذف نهائيًا أو تنتهي صلاحيته أو يُبطل. لا توجد استعادة، وهذا مقصود، ولا نستطيع استرجاعه لك.
- نحتفظ ببيانات الحساب ما دامت مساحة العمل نشطة، ثم 30 يومًا بعد حذفها، ليمكن التراجع عن الحذف غير المقصود.
- تُجمَّع إحصاءات النقرات على الروابط المختصرة بعد 90 يومًا في أعداد مجهولة الهوية.
- لا تحتفظ أحداث سجل التدقيق إلا بالقيم المجزّأة والمملّحة الموضحة في القسم 8، فلا يوجد عنوان أصلي نحتفظ به.
12. الأسرار بدون حساب وأسرار مساحة العمل
مولّد الروابط السرية المجاني ينشئ أسرارًا بدون حساب. الحذف بعد القراءة مفعّل دائمًا، ومدة الصلاحية 1 ساعة أو 24 ساعة أو 7 أيام، والنموذج محمي بخدمة Turnstile من الإساءة الآلية، والتشفير في المتصفح هو نفسه.
يضيف سر مساحة العمل سجل التدقيق والإبطال من لوحة التحكم والمرفقات، وفي خطة Pro عبارات المرور وتاريخًا ووقتًا مخصصين لانتهاء الصلاحية. ونموذج التشفير واحد في الحالتين.
13. الحدود، بوضوح
- إعادة إرسال الرابط إعادة إرسال للسر. لا شيء في التصميم يمنع المستلم من تمرير الرابط إلى غيره قبل فتحه. وما يخفف ذلك مدة صلاحية قصيرة وعبارة مرور تُرسل عبر قناة ثانية.
- ضياع الرابط ضياع للسر. لا نملك المفتاح أبدًا، فلا يوجد ما نسترجعه.
- استثناء ما قبل 29 سبتمبر. الأسرار المنشأة قبل ذلك التاريخ خُزّنت نصًا غير مشفر حتى انتهت صلاحيتها.
- ليست مفتوحة المصدر ولا تدعم الاستضافة الذاتية. عميل التشفير منشور مع متجهات الاختبار في مستودع CLI بترخيص MIT، أما الخدمة نفسها فمنتج مستضاف. وإذا كانت الاستضافة الذاتية شرطًا عندك، فراجع البدائل مفتوحة المصدر.
- المشاهدة ليست شخصًا. يدوّن السجل متى فُتح السر ومن أين تقريبًا، ولا يدوّن أبدًا من فتحه. وإذا فتحه غير الشخص المقصود، فغيّر بيانات الدخول.
14. الإبلاغ عن ثغرة
15. الأسئلة الشائعة
هل السر مشفر من طرف إلى طرف؟
نعم، للأسرار المنشأة من 29 سبتمبر 2026 فصاعدًا. يُشفَّر المحتوى في متصفحك بخوارزمية AES-GCM-256 قبل إرساله، ويوضع المفتاح في الجزء الذي يلي علامة # في رابط المشاركة، والمتصفحات لا ترسل هذا الجزء أبدًا. لا نستلم إلا النص المشفر ولا يصلنا المفتاح أبدًا، فلا نستطيع قراءة السر. والملفات المرفقة تُشفَّر بالطريقة نفسها، بمفتاح مشتق من الرابط نفسه. وهناك تحفظان نذكرهما بوضوح: الأسرار المنشأة قبل ذلك التاريخ ما زالت مخزنة نصًا غير مشفر وتعمل دون تغيير حتى تنتهي صلاحيتها، واسم الملف وحجمه ونوعه ما زالت مخزنة دون تشفير مع أن محتواه مشفر.
هل يستطيع موظفو LinkPilot قراءة أسراري؟
لا، إذا كان السر مشفرًا في متصفحك: مفتاح فك التشفير لا يُرسل إلينا أبدًا، فمن يملك صلاحية كاملة على قاعدة البيانات لا يرى إلا نصًا مشفرًا. وينطبق هذا أيضًا على أي شخص يخترق قاعدة بياناتنا أو خوادم الحافة لدينا. وهناك ثلاثة حدود نذكرها بصدق: السر المنشأ قبل 29 سبتمبر 2026 مخزن نصًا غير مشفر، ويستطيع من يدير النظام قراءته ما دام نشطًا؛ وما زلنا نرى اسم الملف وحجمه ونوعه مع أننا لا نستطيع قراءة محتواه؛ وأي شخص يحصل على رابط المشاركة كاملًا، بما فيه الجزء الذي يلي علامة #، يستطيع فتح السر، ولهذا تبقى مدة الصلاحية القصيرة والحذف بعد القراءة مهمين.
هل تؤدي معاينة الرابط في Slack أو في البريد الإلكتروني إلى حذف السر نهائيًا؟
لا. أدوات معاينة الروابط ترسل طلبات GET، وهذه الطلبات لا تعيد إلا البيانات الوصفية (الحالة، وهل تلزم عبارة مرور). ولا تُسجَّل المشاهدة إلا بطلب إظهار صريح من نوع POST، وهو ما يحدث حين يضغط المستلم بنفسه زر الإظهار.
ما المعلومات التي تُسجَّل عن كل مشاهدة؟
نسجل عن كل مشاهدة: الوقت، وتجزئة عنوان IP (قيمة SHA-256 مع ملح يتغير يوميًا، مقتطعة إلى 32 حرفًا)، والبلد والمدينة من خوادم الحافة إن توفرا، وسلسلة User-Agent. ولا نسجل محتوى السر ولا عبارة المرور الأصلية ولا عنوان IP الأصلي.
هل تُستخدم الأسرار في تدريب النماذج أو في الإحصاءات؟
لا. محتوى الأسرار مستبعد من الإحصاءات ومن بناء ملفات التعريف ومن أي ميزة للذكاء الاصطناعي. ومسار الروابط السرية منفصل عن مسار إحصاءات الروابط الذكية.
هل أستطيع معرفة من فتح السر؟
ليس من فتحه. في خطة Pro يعرض السجل وقت كل إظهار، والبلد والمدينة كما تبلّغ عنهما خوادم الحافة، وسلسلة User-Agent للمتصفح، وتجزئة لعنوان الشبكة بملح يتغير يوميًا. وهذا يكفي لتأكيد التسليم أو لملاحظة فتح من مكان غير متوقع، وهو مصمم بحيث لا يمكن تحويله إلى هوية.
هل أستطيع استضافة LinkPilot ذاتيًا؟
لا. LinkPilot خدمة مستضافة. عميل التشفير منشور في مستودع CLI بترخيص MIT مع متجهات الاختبار ليمكن تدقيقه، لكن الخدمة نفسها ليست مفتوحة المصدر. وإذا كانت الاستضافة الذاتية شرطًا عندك، فالخيارات المعتادة هي OneTimeSecret و Password Pusher و PrivateBin و Yopass.
ماذا يحدث إذا حاول أحد تخمين عبارة المرور بالقوة الغاشمة؟
لا نسمح بأكثر من 5 محاولات لعبارة المرور لكل عنوان IP في الدقيقة لكل سر، ونطبّق هذا الحد على طبقتين (في الذاكرة وفي قاعدة البيانات). وتُكتب المحاولات الفاشلة في سجل التدقيق مع تجزئة عنوان IP.