SaaS شما در حال از دست دادن پول است

بیشتر توسعه‌دهندگان محصول SaaS خود را عرضه می‌کنند و سراغ کار بعدی می‌روند. آن‌ها امنیت را وظیفه‌ای برای آینده می‌دانند. آن‌ها منتظر می‌مانند تا کاربران واقعی یا پول واقعی از راه برسد.

خسارت‌های مالی واقعی اغلب از اشتباهات ساده ناشی می‌شوند. این‌ها هک‌های پیچیده نیستند، بلکه خطاهای منطقی در کد شما هستند.

در اینجا چهار روش رایج که باعث از دست رفتن پول شما می‌شود آورده شده است:

  1. شرایط رقابتی (Race Conditions) در سیستم‌های اعتبار شما موجودی کاربر را می‌خوانید، آن را بررسی می‌کنید و سپس موجودی جدید را می‌نویسید. اگر کاربری دو درخواست را همزمان ارسال کند، ممکن است هر دو درخواست قبل از اینکه اولین درخواست پایگاه داده را به‌روزرسانی کند، از مرحله بررسی عبور کنند. در واقع شما دو سرویس را به قیمت یک سرویس ارائه می‌دهید.

راه حل: از عملیات اتمیک (atomic) پایگاه داده استفاده کنید. به جای خواندن و سپس نوشتن، از یک دستور واحد استفاده کنید تا موجودی را تنها در صورتی به‌روزرسانی کند که کاربر اعتبار کافی داشته باشد.

  1. اعتماد به ورودی کلاینت برای احراز هویت شما آدرس ایمیل را از بدنه درخواست (request body) در هنگام پرداخت دریافت می‌کنید. یک کاربر احراز هویت شده می‌تواند آن ایمیل را به آدرس شخص دیگری تغییر دهد. این کار به آن‌ها اجازه می‌دهد تا جلسات پرداخت را برای حساب‌های اشتباه ایجاد کنند یا سیستم شما را مورد کاوش قرار دهند.

راه حل: هرگز به هویت ارسالی از بدنه درخواست اعتماد نکنید. ایمیل را از توکن نشست (session token) تأیید شده در سرور خود استخراج کنید.

  1. منطق ناقص در صورت‌حساب سالانه بسیاری از توسعه‌دهندگان با گوش دادن به رویدادهای پرداخت Stripe، اعتبار کاربران را بازنشانی (reset) می‌کنند. این روش برای طرح‌های ماهانه کار می‌کند، اما برای طرح‌های سالانه شکست می‌خورد. Stripe در سال تنها یک رویداد ارسال می‌کند. کاربران شما در روز اول اعتبار دریافت می‌کنند و برای یازده ماه آینده چیزی دریافت نمی‌کنند.

راه حل: بازنشانی اعتبار را از رویدادهای صورت‌حساب جدا کنید. از یک cron job روزانه استفاده کنید تا بر اساس تاریخ بازنشانی، بررسی کنید کدام کاربران نیاز به بازنشانی دارند.

  1. ذخیره‌سازی ناامن توکن شما توکن‌های بازنشانی رمز عبور را در localStorage ذخیره می‌کنید. هر اسکریپتی در صفحه شما می‌تواند به localStorage دسترسی داشته باشد؛ این شامل افزونه‌های مرورگر و ابزارهای تحلیل شخص ثالث (third-party analytics) نیز می‌شود.

راه حل: از SDK احراز هویت خود برای مدیریت توکن‌های بازیابی استفاده کنید. اجازه دهید کتابخانه بدون ذخیره کردن توکن در localStorage، آن را به‌طور خودکار پردازش کند.

مشکل همیشه یکسان است: شما به کلاینت اعتماد می‌کنید. اعتماد می‌کنید که درخواست‌ها یکی پس از دیگری می‌رسند. اعتماد می‌کنید که رویدادهای صورت‌حساب تمام موارد را پوشش می‌دهند.

رفع این مشکلات کمتر از یک روز زمان می‌برد. قبل از اینکه پول خود را از دست بدهید، کد خود را بازبینی کنید.

منبع: https://dev.to/manolito99/your-saas-is-probably-leaking-money-right-now-and-you-dont-know-it-1g38