Spectra
تصفّح التوثيق

webhooks

حماية الإعادة

كيف يمنع سبكترا webhook ملتقطاً من أن يُعاد ضد حسابك.


حماية الإعادة على webhook موقّع تردّ هجومين:

  1. مهاجم التقط طلباً صالحاً لا يستطيع إعادة إرساله ليُطلق نفس الأمر مجدّداً.
  2. مرسل سيّئ التصرّف لا يستطيع إعادة إرسال رسائل قديمة بالخطأ بعد تذبذبات الشبكة.

الآلية

كل طلب يحمل X-Spectra-Timestamp. العامل يفرض:

  • نافذة الانتعاش — ٥ دقائق افتراضياً. الطلبات بطوابع زمنية أقدم من الآن − ٥ دقائق تُرفض بـ 401.
  • ذاكرة nonce — يخزّن العامل (secret_id, timestamp, body_hash) لنافذة الانتعاش. الطلب الثاني بنفس الثلاثة يُرفض بـ 409 Conflict. الذاكرة في-الذاكرة فقط (لا كتابة Postgres لكل طلب) فهي رخيصة.

معاً يعنيان: طلب ملتقط قابل للإعادة لـ ٥ دقائق على الأكثر، وفقط إن فاز المهاجم بسباق ضد تسليمك الأصلي.

ضبط النافذة

Profile ← Webhooks ← سرّ ← Advanced ← Freshness window.

دقيقة     →  صارم؛ موصى لشبكات تأخير منخفض
٥ دقائق   →  افتراضي
١٥ دقيقة  →  مرن؛ فقط إن كان لمرسلك تأخير غير متوقّع

النزول دون دقيقة محفوف — انحراف الساعة بين المرسل والعامل قد يجعل طلبات حقيقية تفشل فحوص الانتعاش.

ماذا عن idempotency؟

idempotency (client_id) وحماية الإعادة يحلّان مشكلتين مختلفتين. idempotency يسمح لـ نفس المرسل بإعادة المحاولة بأمان. حماية الإعادة تمنع مرسلاً مختلفاً من إعادة استخدام طلب ملتقط. استخدم الاثنين.

أعراض انحراف الساعة

إن رأيت طلبات مشروعة تُرفض بـ timestamp out of range، فساعة مرسلك تنحرف. افحص NTP. الخطأ يتضمّن وقت العامل الآن لتحسب الفارق.