ورود با شمارهٔ موبایل در سایتهای وردپرسی فارسی تقریباً پیشفرض شده است. کاربر شماره را میزند، کد پیامکی میگیرد و وارد میشود. مشکل اینجاست که بیشتر این افزونهها فقط ظاهر فرم ورود را عوض میکنند و مدیر سایت خیال میکند امنیت هم بالا رفته است. این مطلب شش آزمون ساده دارد که قبل از نصب یا تمدید هر افزونهٔ ورود پیامکی میتوانید روی نسخهٔ آزمایشی سایت انجام بدهید.
مبنای فنیمان راهنمای NIST SP 800-63B-4 است، چون دقیقترین متن عمومی دربارهٔ کد یکبارمصرف پیامکی است، بهعلاوهٔ مستندات خود وردپرس. اگر هنوز سرویسدهندهٔ پیامک را انتخاب نکردهاید، مطلب رتبهبندی امنیتی شرکتهای پیامک انبوه را هم ببینید.
کد چه ویژگیهایی باید داشته باشد
NIST سه چیز را صریح الزام کرده است. کد باید دستکم شش رقم باشد و با یک مولد تصادفی امن ساخته شود. هر کد فقط یک بار پذیرفته شود. و احراز هویت اگر ظرف ده دقیقه کامل نشود، نامعتبر است. خیلی از افزونهها برای راحتی کاربر کد چهار رقمی میفرستند یا آن را تا یک ساعت معتبر نگه میدارند. هر دو انتخاب کار مهاجم را آسان میکند.
دربارهٔ تلاش اشتباه، همان سند میگوید تلاشهای ناموفق پیاپی روی یک حساب نباید از ۱۰۰ بیشتر شود و پیشنهاد میکند فاصلهٔ بین تلاشها بهتدریج بیشتر شود، مثلاً از ۳۰ ثانیه تا یک ساعت. عدد ۱۰۰ سقف است، نه هدف. برای یک فروشگاه کوچک پنج یا ده تلاش و بعد یک مکث چنددقیقهای معقولتر است.
هزینهای که در امنیت دیده نمیشود
هر پیامک برای شما پول دارد. اگر افزونه برای ارسال کد سقفی نگذارد، یک ربات ساده میتواند در یک شب صدها شمارهٔ تصادفی را وارد کند و اعتبار پنل را تمام کند، یا یک نفر را با پیامکهای پشت هم اذیت کند. پس سقف ارسال برای هر شماره و هر IP، یک کپچای سبک بعد از چند درخواست و یک هشدار وقتی مصرف روزانه غیرعادی بالا میرود، جزو امنیت حساب میشوند، نه فقط صرفهجویی.
راههایی که افزونه معمولاً یادش میرود
فرض کنید فرم wp-login.php را کامل با ورود پیامکی عوض کردهاید. وردپرس هنوز دو در دیگر دارد. اولی xmlrpc.php است که با نام کاربری و رمز کار میکند؛ راهنمای امنسازی وردپرس هم حملههای brute force را جزو تهدیدهای اصلی آورده است. دومی Application Passwords است: طبق مستندات REST API وردپرس، از نسخهٔ ۵.۶ وردپرس بهصورت پیشفرض این قابلیت را دارد و هر کاربر میتواند از صفحهٔ پروفایل برای خودش رمز برنامه بسازد و با Basic Auth به REST API وصل شود. اگر افزونهٔ پیامکی این دو مسیر را نبندد یا محدود نکند، ورود پیامکی فقط برای کاربرهای صادق است.
شش آزمون قبل از نصب
| معیار | چرا مهم است | چطور امتحانش کنید |
|---|---|---|
| طول و تصادفی بودن کد | کد دستکم شش رقمی باشد و با مولد تصادفی امن ساخته شود، نه با rand() یا زمان سرور. | چند بار پشت هم کد بگیرید و ببینید الگویی دارد یا نه. |
| یکبارمصرف و مهلت کوتاه | کد بعد از یک ورود موفق باطل شود و بیشتر از ده دقیقه اعتبار نداشته باشد. | با یک کد دو بار وارد شوید. بار دوم باید رد شود. |
| محدودیت تلاش اشتباه | بعد از چند کد غلط، حساب یا آن شماره قفل موقت شود یا مکث بین تلاشها بیشتر شود. | ده کد غلط پشت هم بزنید و ببینید چه اتفاقی میافتد. |
| محدودیت ارسال پیامک | هر شماره و هر IP در یک بازهٔ زمانی سقف ارسال داشته باشد. وگرنه رباتها اعتبار پنل را خالی میکنند. | دکمهٔ «ارسال دوباره» را چند بار پشت هم بزنید. |
| بسته بودن راههای دیگر ورود | xmlrpc.php و Application Passwords هنوز با رمز عبور کار میکنند، حتی اگر فرم ورود عوض شده باشد. | با یک ابزار XML-RPC یا curl همان کاربر را امتحان کنید. |
| تغییر شماره موبایل | عوض کردن شماره یعنی اضافه کردن یک عامل احراز هویت جدید و باید با تأیید شمارهٔ قبلی یا رمز انجام شود. | از پروفایل کاربر شماره را عوض کنید و ببینید چه چیزی میخواهد. |
دربارهٔ آزمون ششم: NIST تعیین یا تغییر شمارهٔ ثبتشده را «اتصال یک عامل احراز هویت جدید» میداند. یعنی اگر کسی بتواند فقط با یک نشست باز، شمارهٔ حساب را عوض کند، از آن به بعد کدهای ورود به گوشی او میرود.
پیامک کجا کافی نیست
NIST در همین نسخه ارسال کد از طریق شبکهٔ تلفن را تنها «احراز هویت محدودشده» میداند و از سازمانها میخواهد پیش از ارسال کد به نشانههای خطر مثل تعویض سیمکارت یا انتقال شماره توجه کنند. برگهٔ تقلب MFA در OWASP هم پیامک را «محدودشده» علامت زده و حملهٔ SIM swap را جداگانه بررسی کرده است. نتیجهٔ عملی برای سایت وردپرسی ساده است: برای مشتریها پیامک خوب است، برای حسابهای مدیر و ویرایشگر یک روش دوم مثل اپ authenticator هم فعال کنید.
اگر سایت شما به سامانههای دیگری هم وصل است، شاید ورود یکپارچه گزینهٔ بهتری باشد. مطلب اتصال سامانهٔ سازمان به دولت من این مسیر را توضیح میدهد.
ذخیره و لاگ
کد را در دیتابیس بهصورت هششده نگه دارید، نه متن ساده، و بعد از مصرف پاکش کنید. کلید API پنل پیامک را در wp-config.php یا متغیر محیطی بگذارید تا اگر یک خروجی پشتیبان از جدول options لو رفت، پنل هم لو نرود. و در لاگها شمارهٔ کامل و کد را ننویسید. حالت دیباگ افزونه را روی سایت اصلی خاموش کنید و ببینید فایل لاگش کجا ذخیره میشود و از بیرون در دسترس هست یا نه.
جایگاه فنپینو
ما افزونهٔ وردپرس نمیفروشیم. فنمیل، سامانهٔ ایمیل سازمانی ما، برای ورود به وبمیل خودش کد پیامکی و ورود دومرحلهای دارد. جزئیاتش در مطلب ورود پیامکی در فنمیل آمده است. اگر سایت شرکتی تازهای میسازید و نمیخواهید امنیت ورود به چند افزونهٔ جانبی وابسته باشد، مطلب CMS دوزبانهٔ فنپینو را هم ببینید.
امنیت افزونهٔ ورود فقط یک لایه است. اگر PHP زیر سایت آسیبپذیر باشد، مثل باگ PHP2Shell در اکتبر ۲۰۲۶، مهاجم بدون رسیدن به فرم ورود هم میتواند کد اجرا کند. راهنمای وصلهٔ PHP2Shell را هم ببینید.
پرسشهای متداول
ورود فقط با پیامک برای مدیر سایت کافی است؟
برای حساب مدیر توصیه نمیکنیم. NIST پیامک را «احراز هویت محدودشده» میداند و میگوید باید دستکم یک روش جایگزین غیرمحدود هم در دسترس باشد. برای مدیرها رمز قوی بهعلاوهٔ اپ authenticator یا کلید امنیتی امنتر است و پیامک را میشود برای مشتریها نگه داشت.
کد چهار رقمی واقعاً مشکل دارد؟
یک کد چهار رقمی فقط ده هزار حالت دارد. اگر محدودیت تلاش هم نباشد، حدس زدنش کار سختی نیست. NIST حداقل شش رقم را الزام کرده است.
XML-RPC را کامل ببندیم؟
اگر اپ موبایل وردپرس یا سرویس دیگری از آن استفاده نمیکند، بله. اگر لازم است، دستکم متد ورود آن را محدود کنید یا افزونهٔ ورود پیامکی را طوری تنظیم کنید که این مسیر را هم پوشش بدهد.
فنمیل افزونهٔ وردپرس دارد؟
نه. ورود پیامکی فنمیل برای وبمیل خود فنمیل است. این راهنما برای انتخاب و آزمودن هر افزونهٔ ورود پیامکی است، از هر سازندهای.
منابع: NIST SP 800-63B-4، OWASP Multifactor Authentication Cheat Sheet و مستندات developer.wordpress.org، بازبینیشده در ۲۱ مهر ۱۴۰۵.



