پیامک پترن و OTP: راهنمای کامل پیادهسازی ورود امن با پیامک
تفاوت پیامک پترن با پیامک عادی، طراحی درست کد یکبارمصرف، محدودسازی نرخ درخواست و نمونهٔ کد اتصال به API.
کد یکبارمصرف (OTP) رایجترین کاربرد پیامک در محصولات نرمافزاری است. برای اینکه هم قابلاعتماد باشد و هم امن، باید از پیامک پترن و چند قاعدهٔ ساده استفاده کنید.
چرا پیامک پترن؟
پیامک پترن روی خطوط خدماتی ارسال میشود و حتی برای کاربرانی که تبلیغات را در سامانهٔ «۱۰۸۸» مسدود کردهاند هم تحویل داده میشود. الگوی پیام از قبل ثبت و تأیید میشود و شما فقط مقادیر متغیر را میفرستید.
مثال الگو:
کد ورود شما به {brand}: {code}
این کد تا {minutes} دقیقه معتبر است.
قواعد طراحی کد یکبارمصرف
- طول کد: ۵ یا ۶ رقم. کمتر از ۵ رقم امنیت کافی ندارد.
- انقضا: بین ۲ تا ۵ دقیقه. کد منقضیشده باید از پایگاه داده حذف یا بیاثر شود.
- یکبار مصرف واقعی: پس از استفادهٔ موفق، کد باطل شود.
- عدم فاش شدن در لاگ: کد را در لاگ سرور یا ابزارهای رصد ذخیره نکنید.
جلوگیری از سوءاستفاده
| تهدید | راهکار |
|---|---|
| ارسال انبوه به یک شماره | حداکثر ۱ پیام در ۶۰ ثانیه و ۵ پیام در ساعت برای هر شماره |
| حدس زدن کد (brute-force) | بعد از ۵ تلاش ناموفق، قفل موقت و درخواست کد جدید |
| هزینهتراشی رقیب | محدودسازی بر اساس IP و شناسهٔ دستگاه علاوه بر شماره |
نمونهٔ ارسال از طریق API
use Illuminate\Support\Facades\Http;
$code = (string) random_int(10000, 99999);
cache()->put("otp:{$mobile}", $code, now()->addMinutes(3));
Http::withToken(config('services.irnoti.key'))
->post('https://api.irnoti.com/v1/pattern/send', [
'sender' => '3000XXXX',
'recipient' => $mobile,
'pattern_code' => 'otp_login',
'variables' => ['code' => $code, 'minutes' => 3],
]);
هنگام تأیید، مقدار واردشده را با مقدار کش مقایسه کنید و در صورت تطابق، بلافاصله کلید کش را حذف کنید.
جمعبندی
OTP خوب یعنی: پیامک پترن روی خط خدماتی، کد کوتاه با انقضای کوتاه، ابطال پس از مصرف و محدودسازی چندلایهٔ نرخ درخواست. همین چند قاعده جلوی بیشتر مشکلات امنیتی و هزینهای را میگیرد.