شعار أوراباسي
aurabaseمستندات
مستندات›Edge Functions›Security model

Edge Functions نموذج الأمان

القواعد التي تحافظ على خصوصية وظائفك ورمزها وأسرارها، والأماكن التي تظل مسؤولاً فيها.

7 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/2026
تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
لقد تغير المصدر الإنجليزي منذ هذه الترجمة. قد تكون بعض المعلومات قديمة.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.
#
الأدوار

1. المفاتيح والأدوار

الدورمفتاحيمكن أن تفعل
anonالمفتاح العام، آمن في المتصفحاستدعاء وظيفة
authenticatedالمفتاح العام بالإضافة إلى JWT الخاص بالمستخدم الذي قام بتسجيل الدخولاستدعاء وظيفة، مع هوية المستخدم
service_roleالمفتاح السري، خادم فقطكل شيء: النشر، وقراءة التعليمات البرمجية والأسرار، والوظائف، والكرون، والتنبيهات
adminجلسة وحدة التحكم في الاستوديوكل شيء، من الاستوديو

ويأتي الدور من المفتاح والرمز المميز، اللذين تتحقق منهما المنصة. لا يمكن للعميل اختياره: لا تزال المكالمة باستخدام المفتاح العام والرأس x-aura-role: service_role تصل إلى وظيفتك كـ anon.

يتم إدراج كل مسار ودوره في مرجع HTTP API.

#
المبدأ

2. لماذا يكون الدعاء علنيا فقط؟

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

تختلف قراءة تعريف للدالة. فهو يحتوي على الكود المصدري ومتغيرات البيئة، والتي غالبًا ما تحتوي على أسرار. قائمة الوظائف والتنبيهات تظهر بياناتك. يؤدي إدراج مهمة إلى تشغيل التعليمات البرمجية الخاصة بك على حصتك. لا يمكن أن يكون أي منها عامًا، وترفضها المنصة باستخدام 403 لأي مفتاح ليس service_role.

والانقسام نفسه موجود في أماكن أخرى. Supabase يتحقق من صحة JWT للمستخدم قبل تشغيل وظيفة Edge افتراضيًا (verify_jwt = true) وينشر الوظائف من خلال واجهة سطر الأوامر والنظام الأساسي (docs). يقوم Firebase بإدراج المهام من بيئة خادم موثوق بها من خلال Admin SDK، مع إذن IAM (docs). Cloudflare يتيح فقط للعامل الإرسال إلى قائمة الانتظار، من خلال الربط (docs).

قبل الإصلاح، كان بإمكان المفتاح العام قراءة التعريفات

أجابت الإصدارات السابقة من الخدمة على GET /v1/functions وGET /v1/functions/{name} على أي مفتاح. إذا تم تشغيل مشروعك على عملية نشر تسبق هذا الإصلاح، فتعامل مع التعليمات البرمجية والمتغيرات الخاصة بوظائفك على أنها مكشوفة وقم بتدوير الأسرار التي تحتوي عليها. راجع الترقية إلى 0.6.

#
الهوية

3. لا يجوز تزوير الهوية

تقوم وظيفتك بقراءة المتصل من x-aura-role و x-aura-user-id و x-aura-project-id. تقوم المنصة بتعيينها بعد التحقق من صحة المفتاح والرمز المميز.

  • لا يمكن للمتصل تزويدهم. تتجاهل المنصة authorization و apikey و x-request-id وأي رأس x-aura-* مرسل في headers لاستدعاء، مهما كانت حالتهم. في اختبار حقيقي، وصلت مكالمة باستخدام x-aura-role: service_role وauthorization مزورة إلى الوظيفة كـ role: "anon" بدون authorization.
  • تمر الرؤوس المخصصة الأخرى دون تغيير. التعامل معها كمدخلات المستخدم.
  • تصل الوظائف وعمليات إطلاق cron إلى وظيفتك بدون رؤوس الهوية. ويتم تشغيلها بواسطة النظام الأساسي، وليس بواسطة المستخدم.

لذا، قم بالتفويض على x-aura-role و x-aura-user-id، وليس على قيمة من النص أبدًا:

aurabase/functions/delete-account/index.tstypescript
Deno.serve((req) => {
  const userId = req.headers.get('x-aura-user-id')
  if (req.headers.get('x-aura-role') !== 'authenticated' || !userId) {
    return new Response('Forbidden', { status: 403 })
  }
  // احذف حساب "معرف المستخدم"، وليس المعرف المأخوذ من الجسم مطلقًا
  return new Response('ok')
})
#
العزلة

4. صندوق الرمل

ما تقدمه لك المنصة:

  • يتم تشغيل كل مكالمة في محرك V8 المعزول الخاص بها، مع حد الذاكرة الخاص بها ومهلة ساعة الحائط الخاصة بها. لا يؤثر التعطل أو التكرار اللانهائي في مكالمة واحدة على مكالمة أخرى.
  • متغيرات بيئة المضيف غير مرئية: Deno.env.get('PATH') أعاد undefined في التشغيل الحقيقي. فقط متغيرات وظيفتك ومتغيرات النظام الأساسي AURABASE_* موجودة.
  • لا يمكن قراءة كود أحد المشاريع بواسطة مشروع آخر: الخدمة التي تخدمه تتطلب رمزًا داخليًا.
  • يتم تقديم الاستجابات التي يمكنها تشغيل البرامج النصية من خلال سياسة أمان محتوى وضع الحماية، ويتم إسقاط رؤوس Set-Cookie وCORS من إحدى الوظائف. راجع ردود .

ما الذي يقدمه لك وليس:

  • الشبكة الصادرة مفتوحة ما لم تقيّدها. عندما يسرد permissions.allow_net مضيفًا واحدًا على الأقل، يرفض وقت التشغيل أي fetch إلى مضيف آخر (Requires net access to "host:443"). القائمة الفارغة، وهي الافتراضية، لا تقيّد شيئًا. اذكر كل مضيف تحتاجه الدالة، بما في ذلك عنوان مشروعك إذا كانت تستدعي المنصة. وحتى مع وجود قائمة، تحقق من أي عنوان URL قادم من مدخلات المستخدم.
  • لا توجد حماية لأسرارك الخاصة في السجلات. أي شيء تكتبه وظيفتك باستخدام console.log يذهب إلى سجلات وقت التشغيل.
  • لا يوجد حد لكل مستخدم. حد معدل الاستدعاء هو لكل عنوان IP للعميل. أضف الشيك الخاص بك إذا لم يكن على أحد المستخدمين الاتصال بوظيفة أكثر من عدة مرات.
#
قائمة التحقق

5. قائمة المراجعة

  • المفتاح service_role موجود فقط على خوادمك وفي أسرار CI الخاصة بك.
  • تحتوي حزمة المتصفح على المفتاح العام فقط. يرفض SDK مفتاح service_role في المتصفح بشكل افتراضي.
  • تتحقق كل وظيفة من x-aura-role قبل أن تفعل أي شيء حساس.
  • الأسرار هي متغيرات الدالة، ولا توجد أبدًا في index.ts.
  • تعمل الوظائف التي تستدعي عناوين URL الخارجية على التحقق من صحة الوجهة.
  • يمكنك تدوير مفتاح عن طريق إنشاء مفتاح جديد في الاستوديو، ونشره باعتباره سرًا، ثم إلغاء المفتاح القديم.