🛡️ امنیت بکاند و محدودیت درخواست (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) بالا میرود. این یعنی ورود موفق و عادی هیچوقت باعث محدودیت نمیشود، اما رباتی که در حال حدس زدن است سریعاً مسدود میشود. (محدودیت: ۵ حدس اشتباه در ۳۰ دقیقه)
// ── 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.", }), ],},