مستنداتبخش برنامه نویسانامنیت و Rate Limiting

🛡️ امنیت بک‌اند و محدودیت درخواست (Rate Limiting)

سیستم احراز هویت (Auth) بک‌اند Medusa مجهز به یکی از پیشرفته‌ترین مکانیزم‌های Rate Limiting است تا از حملات اینترنتی و خسارت‌های مالی جلوگیری کند.


آسیب‌پذیری‌های متداول در E-Commerce

فروشگاه‌های اینترنتی که از ورود با موبایل (SMS OTP) استفاده می‌کنند معمولاً در معرض دو حمله جدی هستند:

  • SMS Bombing: ربات‌ها با ارسال درخواست‌های مکرر به API، باعث ارسال هزاران پیامک و خالی شدن اعتبار پنل پیامکی شما می‌شوند.
  • Brute-Force: هکرها سعی می‌کنند با حدس زدن مکرر کد OTP یا رمز عبور، وارد حساب کاربری دیگران شوند.

استراتژی هوشمند `countOn` در میدل‌ورهای Medusa

برای مقابله با این حملات، در فایل store-admin/src/api/middlewares.ts یک RateLimiter اختصاصی نوشته شده است که به جای مسدود کردن کورکورانه IP، رفتار هوشمندانه‌ای بر اساس وضعیت موفقیت/شکست درخواست دارد:

استراتژی countOn: 'success'

استفاده شده در درخواست ارسال پیامک (Phone Auth)

سیستم فقط زمانی کانتر (Counter) را بالا می‌برد که پیامک با موفقیت ارسال شده باشد (کد 2xx). این باعث می‌شود کاربران بی‌گناهی که به دلیل خطاهای شبکه با کد 4xx مواجه می‌شوند جریمه و بلاک نشوند. (محدودیت: ۳ ارسال در ساعت)

استراتژی countOn: 'failure'

استفاده شده در وارد کردن رمز عبور / OTP

در زمان لاگین، کانتر فقط در صورت وارد کردن رمز اشتباه (خطای 4xx) بالا می‌رود. این یعنی ورود موفق و عادی هیچ‌وقت باعث محدودیت نمی‌شود، اما رباتی که در حال حدس زدن است سریعاً مسدود می‌شود. (محدودیت: ۵ حدس اشتباه در ۳۰ دقیقه)

store-admin/src/api/middlewares.ts (بخش Rate Limiting)
typescript
// ── OTP request: phone (POST /auth/customer/phone-auth) ───────────────
{
method: "POST",
matcher: "/auth/customer/phone-auth",
middlewares: [
createRateLimitMiddleware({
maxAttempts: 3,
windowMs: 60 * 60 * 1000, // 1 hour
countOn: "success", // only count actual OTP sends
message: "Too many OTP requests. Please try again later.",
}),
],
},
// ── OTP register: phone ───────────────────────────────────────────────
{
method: "POST",
matcher: "/auth/customer/phone-register",
middlewares: [
createRateLimitMiddleware({
maxAttempts: 5,
windowMs: 30 * 60 * 1000, // 30 minutes
countOn: "failure", // only penalize wrong codes
message: "Too many failed attempts. Please try again later.",
}),
],
},
استفاده از Redis
وضعیت و تعداد درخواست‌های هر IP در حافظه فوق‌سریع Redis (در کانتینر داکر) ذخیره می‌شود تا در صورت بالا بودن ترافیک سرور، فرآیند اعتبارسنجی با تاخیر صفر (Zero Latency) انجام شود.