لاگین با رمز یکبار مصرف یک روش امن برای فرایند لاگین شدن کاربر به سیستم است . در این روش ، یک رمز یکبار مصرف به اصطلاح توکن (token) به صورت تصادفی ایجاد و به فردی که قصد ورود را دارد ارسال می شود.
OTP یا رمز یکبار مصرف به ایمیل کاربر یا از طریق پیامک به گوشی موبایل کاربر ارسال می شود . زمانی که کاربر کد OTP را وارد کند ، اپلیکیشن احراز هویت را بر اساس این کد انجام می دهد. دقیقا روشی که برای بسیاری از پیام رسان ها مثل تلگرام ، واتساپ و… استفاده می شود.
یکی از روش های جلوگیری از حدس زدن کلمات عبور ضعیف و نامناسب، استفاده از رمزهای یک بار مصرف(One Time Password) می باشد.
در این آموزش قصد داریم ، یک مثال ساده از لاگین با رمز یکبار مصرف (OTP Authentication) در php توسط ایمیل را ببینیم .
در این مثال ، زمانی که کاربر ثبت نام کرده ایمیل خود را برای لاگین وارد کرد ، یک کد OTP به ایمیل کاربر ارسال می شود ، توسط این کد OTP اعتبارسنجی انجام می شود.زمانی که کاربر ار این کد یکبار استفاده کرد ، کد منقضی می شود ، به این معنی که دیگر نمی تواند از آن دوباره استفاده کند. همچنین این توکن برای یک روز فعال خواهد بود ، بعد از آن منقضی و غیرقابل استفاده خواهد شد.
لاگین با رمز یکبار مصرف OTP
کد زیر به شمل یک فرم لاگین برای وارد کردن ایمیل را نشان می دهد. بعد از وارد کردن ایمیل ، یک ورودی (input) دیگر برای وارد کردن کد OTP ارسال شده به ایمیل نشان می دهد. بعد از زدن دکمه submit ، php کد را اعتبار سنجی و نتیجه احراز هویت را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<form name="frmUser" method="post" action=""> <div class="tblLogin"> <?php if(!empty($success == 1)) { ?> <div class="tableheader">Enter OTP</div> <p style="color:#31ab00;">Check your email for the OTP</p> <div class="tablerow"> <input type="text" name="otp" placeholder="One Time Password" class="login-input" required> </div> <div class="tableheader"><input type="submit" name="submit_otp" value="Submit" class="btnSubmit"></div> <?php } else if ($success == 2) { ?> <p style="color:#31ab00;">Welcome, You have successfully loggedin!</p> <?php } else { ?> <div class="tableheader">Enter Your Login Email</div> <div class="tablerow"><input type="text" name="email" placeholder="Email" class="login-input" required></div> <div class="tableheader"><input type="submit" name="submit_email" value="Submit" class="btnSubmit"></div> <?php } ?> </div> </form> |
کد php اعتبارسنجی OTP
بعد از وارد کردن ایمیل ، اسکریپت php از طریق دیتابیس بررسی می کند که آیا کاربری با این ایمیل از قبل ثبت نام کرده است یا نه ، اگر اره ، یک کد OTP 6 رقمی توسط تابع rand() در php ایجاد می شود. شما ممکن است کد های خود را به صورت های دیگه و با مکانیزم های دیگه ایجاد کنید . این کد توسط PHPmailer به ایمیل کاربر ارسال می شود
زمانی که کاربر کد OTP را وارد می کند ، کد از نظر زمان انقضا بررسی می شود . این کد فقط برای یک روز قابل استفاده است و بعد از آن منقضی می شود . کد php به اینصورت است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php $success = ""; $error_message = ""; $conn = mysqli_connect("localhost","root","","blog_samples"); if(!empty($_POST["submit_email"])) { $result = mysqli_query($conn,"SELECT * FROM registered_users WHERE email='" . $_POST["email"] . "'"); $count = mysqli_num_rows($result); if($count>0) { // generate OTP $otp = rand(100000,999999); // Send OTP require_once("mail_function.php"); $mail_status = sendOTP($_POST["email"],$otp); if($mail_status == 1) { $result = mysqli_query($conn,"INSERT INTO otp_expiry(otp,is_expired,create_at) VALUES ('" . $otp . "', 0, '" . date("Y-m-d H:i:s"). "')"); $current_id = mysqli_insert_id($conn); if(!empty($current_id)) { $success=1; } } } else { $error_message = "Email not exists!"; } } if(!empty($_POST["submit_otp"])) { $result = mysqli_query($conn,"SELECT * FROM otp_expiry WHERE otp='" . $_POST["otp"] . "' AND is_expired!=1 AND NOW() <= DATE_ADD(create_at, INTERVAL 24 HOUR)"); $count = mysqli_num_rows($result); if(!empty($count)) { $result = mysqli_query($conn,"UPDATE otp_expiry SET is_expired = 1 WHERE otp = '" . $_POST["otp"] . "'"); $success = 2; } else { $success =1; $error_message = "Invalid OTP!"; } } ?> |
برای دانلود پروژه و کد های لاگین با رمز یکبار مصرف (OTP Authentication) در php از باکس دانلود استفاده کنید.
موفق و پیروز باشید.
سلام مهندس شفیعی وقت بخیر دو تا سوال دارم
یک
من رو سایتم از کاربر هم نام کاربری و هم ایمیل رو از کاربر میگیرم الان تو خیلی از سایتهای معروف دنیا همون ایمیل رو هم برای نام کاربری و هم برای فراموشی رمز میگیرن میخوام بدونم به لحاظ امنیتی ایراد خاصی که نداره درسته ؟ برای ورود از کپچای محاسباتی هم استفاده میکنم
سوال دو
برای کنترل بعضی از ورودی های کاربر من از تابع preg match و preg replace استفاده میکنم آیا این دو تابع توسط هکر قابل دور زدن هست ؟
سپاس از نت پارادیس
سلام. ممنون
نه استفاده فقط از ایمیل مشکلی نداره
نه قابل دور زدن نیست چون از فیلتر دستی برای شناسایی کاراکتر ها و جایگزین استفاده می کنید
سلام مهندس شفیعی وقت بخیر اگر برای ورود به پنل ادمین فقط برای ایمیل خودم کد یکبار مصرف ارسال کنم و وارد بشم آیا این قابل دور زدن هست توسط هکر
سلام ممنون
خیر قابل دور زدن نیست
سلام، ممنون از آموزش خوبتون.
میشه توضیح بدین درمورد otp از طریق پیامک باید چه کار کرد؟ باید از سامانه های ارسال پیامک استفاده کرد؟
سلام ممنون بله باید اون رمز یکبارمصرف ایجاد شده رو برای کاربر پیام ارسال کنید که از سرویس های پیامکی که وجود داره باید داخلکد استفاده کنید
سلام میشه خواهش کنم برای استفاده از این آموزش در لاراول یه مقدار توضیح بدین؟
واقعا ممنونم.
سلام. کدها رو بررسی کنید چیز خاصی مربوط به لاراول نداره همون کدهای ساده php هست و تابعی از لاراول استفاده نمیشه
سلام
اگه میشه در مورد اضافه کردن ورود دو مرحله ای با اپ گوگل Authentication در پی اچ پی و لاگین / ثبت نام در جیمیل با پی اچ پی هم آموزش بزارین ممنون میشم.
از زحمات تون سپاسگذارم.
سلام. بفرمایید :
عضویت و لاگین در سایت با گوگل
موفق باشید.
سلام
خیلی ممنونم.
در مورد اپ گوگل Authentication هم می گفتید.
برای ورود دو مرحله ای و افزایش امنیت.
با تشکر.
سلام. خوشحالیم که مفید واقع شده.
اینجا آموزشش قرار داده شده :
عضویت و لاگین در سایت با گوگل
موفق باشید.
سلام
منظورم این بود :
https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en
رمز ساز گوگل که برخی سایت ها دارن ، بیشتر سایت های مالی.
سلام. در مورد این اطلاعی ندارم.
در اتصال به ایمیل هم مشکل داره کد های (لاگین با رمز یکبار مصرف (OTP Authentication) در php) مشکل نساختن otp داره! چرا؟
مشکل ایمیل که کتابخانه phpmailer بود که باید اضافه می شد که می توانید از باکس دانلود دریافت کنید.
مشکل ایجاد شدن کد هم ممکن است که اتصال یا جداول دیتابیس مشکل داشته باشد که از فایل sql خود فایل دانلود استفاده و کانکشن دیتابیس رو هم چک کنید.
موفق باشید.
می شود در باره اتصال به ان توضیح دهید فقط در فایل functions.phpمشکل دارم؟ایا میتوانید برایم این مشکل را حل کنید؟
سلام. مشکل نبود کتابخانه phpmailer هست که همینک به سورس آماده باکس دانلود اضافه شد مجدد دانلود و استفاده کنید.
باسلام چگونه پنل پارس گرین را به فایل گذاشته شده در تایید شماره موبایل با SMS در PHP متصل کنم؟
سلام. اطلاعی از این پنل ندارم. در سایت خود پنل ارایه دهنده به دنبال بخش هایی مثل توسعه دهنده یا کد نمونه باشید. مطمینا فایل یا کلاس آماده php را برای این کار قرار دادند که میتونید در پروژه خودتون استفاده کنید.
موفق باشید.
سلام من میخوام این اعتبارسنج به فرم ثبت نام و ورود که در همین سایت اموزش داده بودید اجرا کنم که بعد ثبت نام جای این که داخل فرم ورود اول اعتبارسنجی بشه بعد اگه درست بود فرستاده بشه فرم ورود لطفا مانند رمز جدید اینم به قالب تون اضافه کنید یا بگید کجای کد باید عوض کنم ممنون
سلام.
شما باید یک فرم دو مرحله ای برای بخش ورود ایجاد کنید (ساخت فرم چند مرحله ای با php ) به اینصورت که کاربر بعد از وارد کردن ایمیل یا نام کاربری وارد فرم دوم شود که این فرم هم در این آموزش که هستید ساخته شده و کدهاش وجود داره و بعد در این حین شما در سمت php این بخش رمز یکبار مصرف را که باز در این آموزش توضیح داده شده را اضافه کنید تا رمز تصادفی را ساخته و در سطر کاربر در دیتابیس ذخیره و سپس آن را برای کاربر ایمیل کنید.
در این فرم مرحله دوم شما باید کد را از کاربر گرفته و باز در دیتابیس query بزنید تا ببینید آیا هر دو رمز یکسان است یا خیر (که باز کدهاش بالا موجوده). اگر یکسان بود یک سیشن ست می کنید و کاربر را لاگین می کنید که کد این عملیات هم در آموزش ساخت صفحه لاگین که قبلا دیدید هست و در این آموزش هم قرار دادیم.
به هر حال ترکیب این دو مورد کمی دقت بیشتری میخواد تا نتیجه درست بدست بیاد.
موفق باشید.
سلام خسته نباشين
مرسي بايت همه مطالب سايت
كد بار مصرف رو كجا ذخيره مي كنيد؟
اگه رو نشست باشه عمرش برابر با عمر نشست هست
و اگه رو پايگاه داده باشه بحث زمان مطرح مي شه در حقيقت تو اين روش دوبار به پايگاه داده وصل مي شيم
سلام .ممنونم.
همانطور که سورس مشخص است در دیتابیس mysql ذخیره میشه .
میتونید در نشست ذخیره کنید و طبق تعیین تاریخ انقضا session در php , یک تاریخ expiration تعریف کنید.
در هر دو حالت به خوبی کار میکنه و بستگی به سلیقه شما داره .
موفق باشید.
سلام میشه یک نمونه ۲ صفحه html یا php رو بهم با این سورس وصل کنید تا بنده بیشتر متوجه بشم . اگر زحمتی نیست.
بنده میخوام یک صفحه عمومی که برای همه قابل دسترس است رو با این سورس مخفی یا غیر قابل دسترس کنم و تا زمانی که کاربر ایمیل خودشو تایید نکرده اون صفحه رو نتونه مشاهده کنه . طوری باشه که بعد از کلیک روی لینک فعالسازی به اون صفحه دسترسی داشته باشه.
اگر زحمتی نیست میشه کمی بیشتر راهنماییم کنید خیل ممنون.
اگر از لحاظ نمی توانید فایل رو در سایت برای عموم نمایش دهید به ایمیل بنده ارسال کنید.
ممنون میشم.
سلام . نمونه فایل های قرار داده شده بسیار واضح است . اگر نمونه مشابه تری به کار خود که نیاز به ویرایش کمتری دارد را می خواهید این پست را مطالعه کنید.
https://netparadis.com/email-verification-register-php
اگر تسلط کافی بر روی این موضوع و php ندارید بهتر است برای پیاده سازی این قابلیت در cms خود از یک برنامه نویسی کمک بگیرید تا قابلیت مورد نظر را برای شما پیاده سازی کند
موفق و پیروز باشید