کد عددی با تولیدکننده تصادفی رمزنگاریشده؛ برای سناریوهای حساستر میتوان طول بیشتر یا عامل تکمیلی تعریف کرد.
از اولین درخواست تا پایش تولید
راهنمای جامع طراحی و پیادهسازی OTP پیامکی
OTP امن فقط یک عدد تصادفی نیست. طول و عمر کد، محدودیت تلاش، ارسال مجدد، کنترل ربات و SMS Pumping، وضعیتهای تحویل، تجربه کاربری و پایش هزینه باید بهعنوان یک چرخه واحد طراحی شوند.
پیکربندی پایه
نقطه شروع پیشنهادی برای بیشتر سامانهها
این مقادیر نسخه ثابت برای همه کسبوکارها نیستند؛ نقطه شروعی قابل دفاعاند که باید با ریسک عملیات، کیفیت شبکه، نوع کاربر و دادههای واقعی تنظیم شوند.
عمر پیشنهادی عمومی. کد پس از مصرف، انقضا یا صدور کد جدید فوراً نامعتبر شود.
پس از چند ورود اشتباه، همان درخواست قفل شود و ادامه فرایند به تأخیر، بررسی بیشتر یا درخواست جدید نیاز داشته باشد.
ارسال مجدد با فاصله افزایشی؛ دکمه ارسال دوباره از ابتدا فعال نباشد و retry شبکه باعث پیام تکراری نشود.
چرخه کامل
از درخواست کاربر تا تأیید نهایی
اعتبارسنجی مقصد
شماره به قالب استاندارد تبدیل، کشور و نوع خط بررسی و ورودی نامعتبر پیش از هزینهکرد رد میشود.
کنترل ریسک
شماره، IP، دستگاه، حساب، کشور و الگوی ترافیک با سقفها و قواعد ضدربات سنجیده میشوند.
صدور امن کد
کد با CSPRNG تولید، به درخواست و هدف مشخص متصل و فقط بهشکل هش نگهداری میشود.
ارسال یکتا
قالب تأییدشده، شناسه Idempotency و خط خدماتی از ارسال تکراری یا متن نامرتبط جلوگیری میکنند.
تأیید محدود
آخرین کد، زمان اعتبار، تعداد تلاش و وضعیت مصرف بررسی میشوند؛ پاسخ API اطلاعات عضویت را افشا نمیکند.
ثبت و پایش
رویدادها، وضعیت اپراتور، زمان تأیید، هزینه، نرخ خطا و نشانههای سوءاستفاده بدون ذخیره کد خام ثبت میشوند.
پیام باید کوتاه و قابل تشخیص باشد
نام برند، هدف کد و زمان اعتبار را روشن بنویسید. متن را در یک بخش نگه دارید تا تأخیر، هزینه و احتمال جداشدن بخشها کاهش یابد.
متن و تجربه کاربری
کارهایی که انجام دهید و کارهایی که انجام ندهید
✓ انجام دهید
- شماره مقصد را قبل از ارسال به کاربر بهصورت ماسکشده نشان دهید.
- ورودی عددی، Paste و AutoFill سیستمعامل را پشتیبانی کنید.
- شمارش معکوس و زمان امکان ارسال مجدد را شفاف نمایش دهید.
- خطاها را قابل فهم ولی از نظر افشای وجود حساب، یکنواخت طراحی کنید.
- برای کاربران خارج از دسترس SMS، مسیر جایگزین کنترلشده داشته باشید.
- زبان و نام برند پیام را با رابط کاربر هماهنگ کنید.
× انجام ندهید
- کد خام را در دیتابیس، لاگ، APM یا ابزار تحلیل رفتار ذخیره نکنید.
- دکمه «ارسال دوباره» را بلافاصله و بدون محدودیت فعال نکنید.
- با صدور کد جدید، شمارنده تلاشهای ناموفق را صفر نکنید.
- وجود یا عدم وجود حساب را در پاسخ ارسال و تأیید آشکار نکنید.
- OTP را با تخفیف، تبلیغ، لینک فروش یا متن نامرتبط ترکیب نکنید.
- برای انتقال وجه یا داده بسیار حساس فقط به SMS تکیه نکنید.
جلوگیری از سوءاستفاده
SMS Pumping را قبل از ایجاد هزینه متوقف کنید
محدودکردن فقط یک شماره کافی نیست. مهاجم میتواند از شمارههای متوالی، چند IP، چند دستگاه یا پیششمارههای پرهزینه استفاده کند.
سقف در دقیقه، ساعت و روز برای شماره و بازه شمارههای نزدیک.
Rate Limit برای IP، Device ID، Session، حساب و API Key.
اجازهنامه کشورها و اپراتورها؛ مسدودسازی مسیرهای غیرمنتظره یا پرهزینه.
CAPTCHA، تشخیص ربات، سرعت غیرعادی، نرخ Verify پایین و مقصدهای متوالی.
ارسال مجدد
Backoff بهجای ارسال بیوقفه
ارسال دوباره باید خطای واقعی شبکه را پوشش دهد، نه اینکه به ابزار تولید هزینه یا آزار کاربر تبدیل شود.
| مرحله | فاصله پیشنهادی | رفتار | کنترل تکمیلی |
|---|---|---|---|
| ارسال اول | فوری | یک کد فعال و یک شناسه یکتا | کنترل شماره، IP، دستگاه و کشور |
| ارسال دوم | پس از ۳۰ ثانیه | کد قبلی باطل و کد جدید صادر شود | عدم صفرشدن شمارنده تلاش |
| ارسال سوم | پس از ۶۰ ثانیه | بررسی دوباره ریسک و وضعیت اپراتور | CAPTCHA یا تأخیر بیشتر |
| ارسال بعدی | پس از ۱۲۰ ثانیه یا بیشتر | محدود، مشروط یا هدایت به مسیر جایگزین | قفل موقت و هشدار سوءاستفاده |
مدل وضعیت
ارسال، تحویل و تأیید سه مفهوم متفاوتاند
پذیرش پیام توسط سرویسدهنده به معنی رسیدن به گوشی یا ورود صحیح کد نیست. هر مرحله باید وضعیت مستقل داشته باشد.
| Status | معنی | اقدام پیشنهادی |
|---|---|---|
| created | درخواست OTP ایجاد شده ولی هنوز وارد صف ارسال نشده است. | بررسی ریسک و رزرو اعتبار. |
| queued | پیام در صف SMSDaily یا سرویسدهنده قرار دارد. | عدم ارسال مجدد فوری. |
| provider_accepted | اپراتور یا تأمینکننده درخواست را پذیرفته است. | انتظار برای گزارش تحویل. |
| delivered | گزارش تحویل اپراتور دریافت شده است. | هنوز به معنی Verify نیست. |
| verified | کد صحیح در زمان معتبر و با تلاش مجاز وارد شده است. | مصرف کد و پایان چرخه. |
| expired | زمان اعتبار پایان یافته است. | صدور درخواست جدید با کنترل نرخ. |
| max_attempts | سقف تلاش ناموفق پر شده است. | قفل درخواست و افزایش کنترل ریسک. |
| blocked | درخواست بهدلیل تقلب، کشور، مقصد یا سیاست حساب رد شده است. | ثبت دلیل داخلی بدون افشای جزئیات به مهاجم. |
| failed | خطای فنی یا اپراتوری مانع ارسال شده است. | Retry کنترلشده یا مسیر جایگزین. |
شاخصهای عملیاتی
فقط تعداد پیام ارسالی را اندازه نگیرید
نرخ Verify
درصد درخواستهایی که در زمان معتبر با موفقیت تأیید میشوند؛ شاخص اصلی سلامت تجربه کاربر.
زمان میانه تأیید
فاصله درخواست تا Verify؛ افزایش آن میتواند نشانه تأخیر شبکه یا رابط نامناسب باشد.
نرخ ارسال مجدد
ارسال مجدد زیاد میتواند از تأخیر، متن مبهم، شماره اشتباه یا طراحی نامناسب ناشی شود.
نرخ تلاش ناموفق
افزایش خطا در یک شماره، IP یا دستگاه میتواند نشانه حدس کد یا حمله خودکار باشد.
هزینه هر Verify موفق
هزینه واقعی باید بر تأیید موفق تقسیم شود، نه فقط بر تعداد پیام ارسالشده.
مسدودی تقلب
تعداد و ارزش درخواستهای متوقفشده، کشورها و پیششمارههای پرریسک و خطای مثبت کنترل شوند.
محدودیت امنیتی SMS
OTP پیامکی برای همه عملیات، عامل نهایی نیست
شماره موبایل میتواند منتقل شود، سیمکارت تعویض شود و پیام در معرض فیشینگ یا حملات زیرساختی قرار گیرد. برای انتقال وجه، تغییر مالکیت، دسترسی به اطلاعات بسیار حساس یا بازیابی حسابهای ارزشمند، احراز هویت مرحلهای طراحی کنید.
توسعه و آزمایش
در محیط توسعه پیام واقعی ارسال نکنید
شمارههای آزمایشی و کدهای ثابت کنترلشده برای سناریوهای موفق و ناموفق.
رابط مستقل برای Mock، Sandbox و سرویس واقعی تا منطق کسبوکار به اپراتور قفل نشود.
قطع شبکه و retry نباید پیام یا هزینه تکراری ایجاد کند.
انقضا، کد اشتباه، سقف تلاش، عدم تحویل، مسدودی و اختلال سرویس آزمایش شوند.
ارزیابی تعاملی
سامانه شما برای OTP در محیط واقعی آماده است؟
موارد پیادهسازیشده را علامت بزنید. نتیجه در همین مرورگر ذخیره میشود و صرفاً یک راهنمای فنی است، نه گواهی امنیت.
پرسشهای رایج
پاسخهای کوتاه برای تصمیمهای متداول
کد OTP چند رقم باشد؟
شش رقم برای بیشتر کاربردهای ورود و تأیید شماره نقطه شروع مناسبی است. برای ریسک بالاتر، طول بیشتر بهتنهایی کافی نیست و بهتر است عامل تکمیلی تعریف شود.
اعتبار دو دقیقه همیشه مناسب است؟
خیر. دو دقیقه پیشنهاد پایه است. کیفیت شبکه، جامعه کاربری و حساسیت عملیات باید سنجیده شوند؛ اما عمر کد نباید بیدلیل طولانی شود.
آیا با ارسال مجدد، کد قبلی معتبر بماند؟
بهتر است فقط جدیدترین کد فعال باشد. ارسال مجدد کد قبلی را باطل کند ولی شمارنده خطا و کنترلهای سوءاستفاده را صفر نکند.
چرا OTP تحویل شده ولی کاربر تأیید نمیکند؟
ممکن است شماره اشتباه، پیام مبهم، تأخیر رابط، کپی دشوار، فیشینگ، درخواست رباتی یا رهاکردن فرایند علت باشد. به همین دلیل Delivered و Verified باید جدا اندازهگیری شوند.
SMS Pumping چیست؟
ارسال عمدی تعداد زیاد OTP به مقصدهای خاص برای تحمیل هزینه یا کسب درآمد از مسیر مخابراتی است. Rate Limit چندبعدی، کنترل کشور و اپراتور، تشخیص مقصدهای متوالی و پایش نرخ Verify برای مقابله لازماند.
آیا SMS برای انتقال وجه کافی است؟
برای عملیات بسیار حساس، SMS بهتنهایی توصیه نمیشود. Passkey، TOTP، Push یا تأیید تکمیلی میتواند ریسک فیشینگ و تعویض سیمکارت را کاهش دهد.
تعرفه OTP در SMSDaily چقدر است؟
ثبتنام و فعالسازی اولیه رایگان است و هر OTP فارسی تکبخشی با قالب تأییدشده ۲۵۰ تومان محاسبه میشود.
OTP را با کنترلهای درست راهاندازی کنید
حساب رایگان بسازید و قالب، حجم ماهانه، مدل اتصال و الزامات امنیتی خود را برای بررسی ارسال کنید.