نموذج أمان الرمز
تتكون رموز L402 من جزأين مرتبطين بـ::
- Macaroon — JSON مُرمَّز بـ base64 يحتوي على
{hash, exp}. موقَّع بـ SHA-256. لا يمكن تزويره دون معرفة الـ preimage. - Preimage — السر المكوَّن من 32 بايت الذي يجب، عند تجزئته بـ SHA-256، أن يطابق الـ hash المُضمَّن في الـ macaroon.
الحماية من إعادة التشغيل
يتضمن l402-kit حماية مدمجة من إعادة التشغيل. يمكن استخدام كل preimage مرة واحدة فقط:401 Token already used.
المخزن الافتراضي: Set في الذاكرة. هذا يعني:
- إعادة التشغيل تمسح مخزن إعادة التشغيل (تصبح الرموز قابلة لإعادة الاستخدام عبر عمليات إعادة التشغيل)
- النسخ المتعددة لا تتشارك الحالة
انتهاء صلاحية الرمز
تحمل الرموز حقلexp (طابع زمني Unix بالميلي ثانية). يرفض SDK الرموز منتهية الصلاحية تلقائيًا.
مدة الصلاحية الافتراضية: ساعة واحدة (تُحدَّد من موفر Lightning عند إنشاء الفاتورة).
HTTPS مطلوب
لا تستخدم L402 عبر HTTP العادي في الإنتاج أبدًا. يتم نقل الـ macaroon والـ preimage في رأسAuthorization. عبر HTTP، يكونان مكشوفَين لمهاجمي الشبكة.
تحديد معدل الطلبات
يتحقق L402 من الرموز تشفيريًا، لا من خلال البحث في قاعدة بيانات — لذا فهو رخيص التكلفة. لكن إنشاء فاتورة Lightning (استجابة 402) يستدعي واجهة برمجة موفر Lightning الخاص بك. احمِ إنشاء الفاتورة بمُحدِّد معدل لمنع هجمات DoS:إدارة الأسرار
لا تُضمِّن مفاتيح API في الكود مطلقًا. استخدم متغيرات البيئة:.env + dotenv (لا يُودَع في git أبدًا).
مصادقة نقاط النهاية الإدارية
إذا كنت تكشف عن نقاط نهاية إدارية أو إحصائية، لا تقبل الأسرار أبدًا عبر معاملات استعلام URL. تُسجَّل عناوين URL كاملةً من قِبَل الوكلاء العكسيين وشبكات توصيل المحتوى ومزودي الخدمات السحابية — بما في ذلك سلسلة الاستعلام.نظافة مفاتيح Supabase
استخدمSUPABASE_SERVICE_KEY (من جانب الخادم فقط) مقابل SUPABASE_ANON_KEY (آمن للكشف للعملاء) بشكل صحيح:
| المفتاح | الاستخدام | يتجاوز RLS؟ |
|---|---|---|
anon | امتداد VS Code، عملاء المتصفح | لا |
service_role | وظائف API من جانب الخادم | نعم |
pro_access) استخدام مفتاح الخدمة — وليس مفتاح anon أبدًا. لا ينبغي أن تمنح سياسات RLS على الجداول الحساسة وصول anon.
سياسة أمان المحتوى
إذا كنت تقدم واجهة أمامية جنبًا إلى جنب مع واجهة برمجة التطبيقات، تأكد من أن CSP لا تحجب تدفق L402:إدارة البيانات — حذف بيانات المستخدم
يمكن للمستخدمين حذف جميع سجلات المدفوعات واشتراك Pro الخاص بهم من داخل امتداد VS Code في أي وقت (الإعدادات ← منطقة الخطر). يستدعي الامتداد:- جميع الصفوف في
paymentsحيثowner_address = ? - جميع الصفوف في
pro_accessحيثaddress = ?
يطلب الامتداد من المستخدم كتابة عنوان Lightning الخاص به حرفيًا قبل تفعيل زر الحذف — تأكيد على غرار GitHub للإجراءات التدميرية.
الخصوصية وتقليل البيانات
تم تصميم l402-kit لجمع الحد الأدنى من البيانات اللازمة للتشغيل. فيما يلي ما يتم تخزينه، وسبب التخزين، وكيفية تعزيز كل حقل.ما يتم تخزينه
| الجدول | الحقل | السبب | الحساسية |
|---|---|---|---|
payments | preimage | الحماية من إعادة التشغيل + إثبات الدفع | ⚠️ متوسط — جزِّئه بدلًا من ذلك (انظر أدناه) |
payments | owner_address | نسب الإيرادات إلى عنوان Lightning | منخفض — عناوين Lightning عامة |
payments | amount_sats | إحصائيات لوحة التحكم | منخفض |
payments | endpoint | تحليلات لكل نقطة نهاية | منخفض–متوسط |
pro_access | address | التحقق من اشتراك Pro | منخفض — عام |
waitlist | email | إرسال رسائل الترحيب والإصدار | ⚠️ مرتفع — بيانات PII حقيقية، قم بتشفيرها أو حذفها |
waitlist | lightning_address | إشارة هوية اختيارية | منخفض |
تجزئة الـ preimages بدلًا من تخزينها خامًا
الـ preimage هو السر المكوَّن من 32 بايت الذي يُثبت إجراء دفع Lightning. تخزينه خامًا يعني أن خرق قاعدة البيانات يكشف كل إثبات. خزِّن تجزئة SHA-256 بدلًا من ذلك — فهي موجودة بالفعل بشكل علني (مُضمَّنة في فاتورة BOLT11) وكافية للحماية من إعادة التشغيل:حماية رسائل البريد الإلكتروني في قائمة الانتظار
عناوين البريد الإلكتروني هي بيانات PII الحقيقية الوحيدة في النظام. الخيارات مرتبة تصاعديًا حسب مستوى الحماية:إثبات ملكية المحفظة قبل حذف البيانات (LNURL-auth)
يجب أن تقبل نقطة النهاية/api/delete-data الطلبات من المالك الفعلي لعنوان Lightning فقط. استخدم LNURL-auth لإثبات الملكية تشفيريًا — يوقِّع المستخدم تحديًا من الخادم بمفتاح المحفظة الخاص بـ Lightning، دون الحاجة إلى كلمة مرور أو حساب:
راجع مخطط التدفق الكامل للتسلسل الكامل مع حالة Supabase.
هذا يضمن أنه لا يمكن لأحد حذف سجلات مستخدم آخر، حتى لو كان يعرف عنوان Lightning.
قائمة التحقق
قبل الإطلاق
قبل الإطلاق
- HTTPS مفروض على جميع نقاط النهاية
- مفاتيح API في متغيرات البيئة، وليس في الكود المصدري
- نقاط النهاية الإدارية/الإحصائية تستخدم مصادقة الرأس، وليس معاملات URL
?secret= - مفتاح
service_roleفي Supabase مستخدَم من جانب الخادم؛ مفتاحanonفقط على العملاء - جداول Supabase الحساسة لا تحتوي على سياسة SELECT لـ
anon - نقطة نهاية حذف البيانات (
/api/delete-data) تستخدم مفتاح الخدمة، وليس anon أبدًا - مُحدِّد معدل على إنشاء الفاتورة
- الحماية من إعادة التشغيل مُختبَرة (جرِّب إعادة استخدام preimage → توقع 401)
- انتهاء صلاحية الرمز مُختبَر (اضبط مدة صلاحية قصيرة في التطوير، وتأكد من 401 بعد الانتهاء)
- الـ preimages مخزَّنة كتجزئات SHA-256، وليس أسرارًا خامة
- رسائل البريد الإلكتروني في قائمة الانتظار مُشفَّرة في حالة الراحة أو مُتخلَّص منها بعد الإرسال
-
/api/delete-dataيتطلب إثبات LNURL-auth لملكية المحفظة
لواجهات برمجة التطبيقات ذات الحركة العالية
لواجهات برمجة التطبيقات ذات الحركة العالية
- مخزن إعادة تشغيل مدعوم بـ Redis (مشترك عبر النسخ)
- مراقبة معدلات استجابة 402 (الارتفاع المفاجئ = هجوم DoS محتمل)
- تجاوز فشل موفر Lightning (BlinkProvider → LNbitsProvider كبديل)
- مراقبة صفحة الحالة لموفر Lightning الخاص بك (مثل status.blink.sv)