این راهنما از جمع‌بندی ۴۶ صفحه و مستند فنی درباره OTP، احراز هویت و جلوگیری از سوءاستفاده تهیه شده است.

از اولین درخواست تا پایش تولید

راهنمای جامع طراحی و پیاده‌سازی OTP پیامکی

OTP امن فقط یک عدد تصادفی نیست. طول و عمر کد، محدودیت تلاش، ارسال مجدد، کنترل ربات و SMS Pumping، وضعیت‌های تحویل، تجربه کاربری و پایش هزینه باید به‌عنوان یک چرخه واحد طراحی شوند.

۶ رقم پیشنهادیاعتبار پایه ۲ دقیقه۳ تلاش ناموفقفقط یک کد فعال

پیکربندی پایه

نقطه شروع پیشنهادی برای بیشتر سامانه‌ها

این مقادیر نسخه ثابت برای همه کسب‌وکارها نیستند؛ نقطه شروعی قابل دفاع‌اند که باید با ریسک عملیات، کیفیت شبکه، نوع کاربر و داده‌های واقعی تنظیم شوند.

۶ رقم

کد عددی با تولیدکننده تصادفی رمزنگاری‌شده؛ برای سناریوهای حساس‌تر می‌توان طول بیشتر یا عامل تکمیلی تعریف کرد.

۲ دقیقه

عمر پیشنهادی عمومی. کد پس از مصرف، انقضا یا صدور کد جدید فوراً نامعتبر شود.

۳ تلاش

پس از چند ورود اشتباه، همان درخواست قفل شود و ادامه فرایند به تأخیر، بررسی بیشتر یا درخواست جدید نیاز داشته باشد.

۳۰، ۶۰، ۱۲۰ ثانیه

ارسال مجدد با فاصله افزایشی؛ دکمه ارسال دوباره از ابتدا فعال نباشد و retry شبکه باعث پیام تکراری نشود.

حد بالای اعتبار نباید به‌صورت نامحدود افزایش یابد. برای عملیات با ارزش بالا، صرفاً طولانی‌ترکردن عمر یا طول کد جایگزین عامل احراز هویت قوی‌تر نیست.

چرخه کامل

از درخواست کاربر تا تأیید نهایی

اعتبارسنجی مقصد

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

کنترل ریسک

شماره، IP، دستگاه، حساب، کشور و الگوی ترافیک با سقف‌ها و قواعد ضدربات سنجیده می‌شوند.

صدور امن کد

کد با CSPRNG تولید، به درخواست و هدف مشخص متصل و فقط به‌شکل هش نگهداری می‌شود.

ارسال یکتا

قالب تأییدشده، شناسه Idempotency و خط خدماتی از ارسال تکراری یا متن نامرتبط جلوگیری می‌کنند.

تأیید محدود

آخرین کد، زمان اعتبار، تعداد تلاش و وضعیت مصرف بررسی می‌شوند؛ پاسخ API اطلاعات عضویت را افشا نمی‌کند.

ثبت و پایش

رویدادها، وضعیت اپراتور، زمان تأیید، هزینه، نرخ خطا و نشانه‌های سوءاستفاده بدون ذخیره کد خام ثبت می‌شوند.

نمونه پیام پیشنهادی کد ورود به فروشگاه نمونه: 482731
اعتبار: ۲ دقیقه
این کد را در اختیار دیگران قرار ندهید.

پیام باید کوتاه و قابل تشخیص باشد

نام برند، هدف کد و زمان اعتبار را روشن بنویسید. متن را در یک بخش نگه دارید تا تأخیر، هزینه و احتمال جداشدن بخش‌ها کاهش یابد.

نام برندضروری
هدف کدروشن
تبلیغاتممنوع
لینکترجیحاً خیر

متن و تجربه کاربری

کارهایی که انجام دهید و کارهایی که انجام ندهید

✓ انجام دهید

  • شماره مقصد را قبل از ارسال به کاربر به‌صورت ماسک‌شده نشان دهید.
  • ورودی عددی، Paste و AutoFill سیستم‌عامل را پشتیبانی کنید.
  • شمارش معکوس و زمان امکان ارسال مجدد را شفاف نمایش دهید.
  • خطاها را قابل فهم ولی از نظر افشای وجود حساب، یکنواخت طراحی کنید.
  • برای کاربران خارج از دسترس SMS، مسیر جایگزین کنترل‌شده داشته باشید.
  • زبان و نام برند پیام را با رابط کاربر هماهنگ کنید.

× انجام ندهید

  • کد خام را در دیتابیس، لاگ، APM یا ابزار تحلیل رفتار ذخیره نکنید.
  • دکمه «ارسال دوباره» را بلافاصله و بدون محدودیت فعال نکنید.
  • با صدور کد جدید، شمارنده تلاش‌های ناموفق را صفر نکنید.
  • وجود یا عدم وجود حساب را در پاسخ ارسال و تأیید آشکار نکنید.
  • OTP را با تخفیف، تبلیغ، لینک فروش یا متن نامرتبط ترکیب نکنید.
  • برای انتقال وجه یا داده بسیار حساس فقط به SMS تکیه نکنید.

جلوگیری از سوءاستفاده

SMS Pumping را قبل از ایجاد هزینه متوقف کنید

محدودکردن فقط یک شماره کافی نیست. مهاجم می‌تواند از شماره‌های متوالی، چند IP، چند دستگاه یا پیش‌شماره‌های پرهزینه استفاده کند.

مقصد

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

منبع

Rate Limit برای IP، Device ID، Session، حساب و API Key.

جغرافیا

اجازه‌نامه کشورها و اپراتورها؛ مسدودسازی مسیرهای غیرمنتظره یا پرهزینه.

رفتار

CAPTCHA، تشخیص ربات، سرعت غیرعادی، نرخ Verify پایین و مقصدهای متوالی.

ارسال OTP باید پس از کنترل ریسک انجام شود، نه اینکه ابتدا پیام ارسال و سپس هزینه و تقلب تحلیل شود. برای جهش ناگهانی هزینه یا کاهش نرخ تأیید، هشدار و Circuit Breaker تعریف کنید.

ارسال مجدد

Backoff به‌جای ارسال بی‌وقفه

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

مرحلهفاصله پیشنهادیرفتارکنترل تکمیلی
ارسال اولفورییک کد فعال و یک شناسه یکتاکنترل شماره، IP، دستگاه و کشور
ارسال دومپس از ۳۰ ثانیهکد قبلی باطل و کد جدید صادر شودعدم صفرشدن شمارنده تلاش
ارسال سومپس از ۶۰ ثانیهبررسی دوباره ریسک و وضعیت اپراتورCAPTCHA یا تأخیر بیشتر
ارسال بعدیپس از ۱۲۰ ثانیه یا بیشترمحدود، مشروط یا هدایت به مسیر جایگزینقفل موقت و هشدار سوءاستفاده
Retry فنی HTTP نباید پیام جدید تولید کند. همان درخواست باید با Idempotency Key تکرار شود تا نتیجه قبلی بازیابی یا ادامه داده شود.

مدل وضعیت

ارسال، تحویل و تأیید سه مفهوم متفاوت‌اند

پذیرش پیام توسط سرویس‌دهنده به معنی رسیدن به گوشی یا ورود صحیح کد نیست. هر مرحله باید وضعیت مستقل داشته باشد.

Statusمعنیاقدام پیشنهادی
createdدرخواست OTP ایجاد شده ولی هنوز وارد صف ارسال نشده است.بررسی ریسک و رزرو اعتبار.
queuedپیام در صف SMSDaily یا سرویس‌دهنده قرار دارد.عدم ارسال مجدد فوری.
provider_acceptedاپراتور یا تأمین‌کننده درخواست را پذیرفته است.انتظار برای گزارش تحویل.
deliveredگزارش تحویل اپراتور دریافت شده است.هنوز به معنی Verify نیست.
verifiedکد صحیح در زمان معتبر و با تلاش مجاز وارد شده است.مصرف کد و پایان چرخه.
expiredزمان اعتبار پایان یافته است.صدور درخواست جدید با کنترل نرخ.
max_attemptsسقف تلاش ناموفق پر شده است.قفل درخواست و افزایش کنترل ریسک.
blockedدرخواست به‌دلیل تقلب، کشور، مقصد یا سیاست حساب رد شده است.ثبت دلیل داخلی بدون افشای جزئیات به مهاجم.
failedخطای فنی یا اپراتوری مانع ارسال شده است.Retry کنترل‌شده یا مسیر جایگزین.

شاخص‌های عملیاتی

فقط تعداد پیام ارسالی را اندازه نگیرید

نرخ Verify

درصد درخواست‌هایی که در زمان معتبر با موفقیت تأیید می‌شوند؛ شاخص اصلی سلامت تجربه کاربر.

زمان میانه تأیید

فاصله درخواست تا Verify؛ افزایش آن می‌تواند نشانه تأخیر شبکه یا رابط نامناسب باشد.

نرخ ارسال مجدد

ارسال مجدد زیاد می‌تواند از تأخیر، متن مبهم، شماره اشتباه یا طراحی نامناسب ناشی شود.

نرخ تلاش ناموفق

افزایش خطا در یک شماره، IP یا دستگاه می‌تواند نشانه حدس کد یا حمله خودکار باشد.

هزینه هر Verify موفق

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

مسدودی تقلب

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

محدودیت امنیتی SMS

OTP پیامکی برای همه عملیات، عامل نهایی نیست

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

ورود عمومیSMS مناسب
تراکنش پرریسکStep-up
عامل قوی‌ترPasskey / TOTP
Fallbackکنترل‌شده
عامل جایگزین نباید از عامل اصلی ضعیف‌تر و بدون کنترل باشد. تغییر شماره یا بازیابی دسترسی نیز یک عملیات پرریسک است.

توسعه و آزمایش

در محیط توسعه پیام واقعی ارسال نکنید

Test Numbers

شماره‌های آزمایشی و کدهای ثابت کنترل‌شده برای سناریوهای موفق و ناموفق.

Provider Adapter

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

Idempotency Tests

قطع شبکه و retry نباید پیام یا هزینه تکراری ایجاد کند.

Failure Matrix

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

ارزیابی تعاملی

سامانه شما برای OTP در محیط واقعی آماده است؟

موارد پیاده‌سازی‌شده را علامت بزنید. نتیجه در همین مرورگر ذخیره می‌شود و صرفاً یک راهنمای فنی است، نه گواهی امنیت.

پرسش‌های رایج

پاسخ‌های کوتاه برای تصمیم‌های متداول

کد OTP چند رقم باشد؟

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

اعتبار دو دقیقه همیشه مناسب است؟

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

آیا با ارسال مجدد، کد قبلی معتبر بماند؟

بهتر است فقط جدیدترین کد فعال باشد. ارسال مجدد کد قبلی را باطل کند ولی شمارنده خطا و کنترل‌های سوءاستفاده را صفر نکند.

چرا OTP تحویل شده ولی کاربر تأیید نمی‌کند؟

ممکن است شماره اشتباه، پیام مبهم، تأخیر رابط، کپی دشوار، فیشینگ، درخواست رباتی یا رهاکردن فرایند علت باشد. به همین دلیل Delivered و Verified باید جدا اندازه‌گیری شوند.

SMS Pumping چیست؟

ارسال عمدی تعداد زیاد OTP به مقصدهای خاص برای تحمیل هزینه یا کسب درآمد از مسیر مخابراتی است. Rate Limit چندبعدی، کنترل کشور و اپراتور، تشخیص مقصدهای متوالی و پایش نرخ Verify برای مقابله لازم‌اند.

آیا SMS برای انتقال وجه کافی است؟

برای عملیات بسیار حساس، SMS به‌تنهایی توصیه نمی‌شود. Passkey، TOTP، Push یا تأیید تکمیلی می‌تواند ریسک فیشینگ و تعویض سیم‌کارت را کاهش دهد.

تعرفه OTP در SMSDaily چقدر است؟

ثبت‌نام و فعال‌سازی اولیه رایگان است و هر OTP فارسی تک‌بخشی با قالب تأییدشده ۲۵۰ تومان محاسبه می‌شود.

OTP را با کنترل‌های درست راه‌اندازی کنید

حساب رایگان بسازید و قالب، حجم ماهانه، مدل اتصال و الزامات امنیتی خود را برای بررسی ارسال کنید.