ساخت لینک یکبار مصرف در php برای فروش محصولات دانلودی ، لینک های فعال سازی اکانت کاربری ، و یا دسترسی به یک سری فایل های خاص برای کاربران بصورت لینک های زمان دار و یا نامحدود ، استفاده می شود . در این آموزش به شما نحوه ساخت لینک یکبار مصرف در php و همچنین تعیین مدت زمان انقضا را به شما نشان می دهیم .
ساخت لینک یکبار مصرف
فرض کنید سیستم مدیریت محتوایی دارید که اطلاعات مربوط به هر کاربر را در یک سطر از جدول دیتابیس ذخیره می کند .بعد از ثبت نام ، کاربر یک ایمیل فعال سازی همراه با لینک یکبار مصرف برای اکانت خود دریافت می کند . با این آدرس URL یکبار مصرف که شامل پارامتر token است می توانیم کاربران را از هم تشخیص بدیم .
لینک یکبار مصرف ما به صورت زیر خواهد بود .
http://example.com/activate?token=ee97780…
مطمینا ، عمل شناسایی کاربر از طریق دیتابیس انجام خواهد شد . بنابراین جدول pending_users را با فیلد های زیر می سازیم . به طور مستقیم برای ساخت جدول می توانید از کد SQL زیر استفاده کنید.
1 2 3 4 5 6 |
CREATE TABLE pending_users ( token CHAR(40) NOT NULL, username VARCHAR(45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMARY KEY(token) ); |
این جدول مقدار نام کاربری ، توکن یکتا ، و مقدار timestamp را ذخیره می کند . از تابع sha1() برای ساخت یک رشته با ۴۰ کاراکتر استفاده می کنیم . مقدار tstamp یک فیلد unsignedعددی است که برای ذخیره زمان ساخت توکن استفاده می شود که البته می توانید برای ساخت مکانیزم زمان انقضا از آن بهره ببریم .
راه های زیادی برای ساخت یک توکن (token) وجود دارد ، امادر اینجا به سادگی از تابع uniqid() و تابع sha1() بهره می بریم . از هر روش دیگری که می خواهید استفاده کنید توجه کنید که باید غیرقابل حدس (random) باشد و احتمال بسیار کمی برای تکراری بودن داشته باشد .
1 2 |
<?php $token = sha1(uniqid($username, true)); |
Uniqid یک رشته را دریافت و یک آی دی منحصر به فرد بر اساس رشته و زمان برحسب میکروثانیه ، برگشت می دهد . تابع uniqid همچنین یک مقدار boolean برای ساخت مقدار یکتای دقیق تر دریافت می کند .
تابع sha1 برای محاسبه هش رشته داده شده با الگوریتم US Secure Hash استفاده می شود .
همینکه توابع بالا اجرا شود ، یک رشته ۴۰ کاراکتری منحصر به فرد برای ساخت لینک یکبار مصرف ، ایجاد می کند .ما این مقدار توکس را همراه با یوزرنیم و timestamp در دیتابیس ذخیره میکنیم تا بعدا به آن برای شناسایی ارجاع کنیم .
1 2 3 4 5 6 7 8 9 10 11 |
<?php $query = $db->prepare( "INSERT INTO pending_users (username, token, tstamp) VALUES (?, ?, ?)" ); $query->execute( array( $username, $token, $_SERVER["REQUEST_TIME"] ) ); |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
اگر با نحوه اتصال به دیتابیس با pdo در php آشنا نستید ، کلیک کنید
در پروژه های واقعی احتمال دارد شما ID کاربر را در یک جدول دیگر ذخیره کنید و بعدا آنها را بهم JOIN بزنید ، ولی در این مثال من فقط از رشته یوزرنیم استفاده می کنیم .
حالا با اطلاعات بالا ، به راحتی می توانیم لینک یکبار مصرف خود را بسازیم
1 2 |
<?php $url = "http://example.com/activate.php?token=$token"; |
این URL می تواند به روش هایی در اختیار کاربر قرار می گیرد که در اینجا از ارسال ایمیل در php استفاده می کنیم.
1 2 3 4 5 6 7 |
<?php $message = <<<ENDMSG Thank you for signing up at our site. Please go to $url to activate your account. ENDMSG; mail($address, "Activate your account", $message); |
مصرف یک آدرس URL
همینکه لینک یکبار مصرف توسط کاربر اجرا شد ، باید مقدار توکن را از طریق پارامتر token دریافت و آن را با توکن ذخیره شده در دیتابیس مقایسه کنیم . اگر توکن معتبر بود ، می توانید عملیات را انجام بدیم (ارسال فایل به کاربر ، ..) . در این مثال ، ما فعال سازی اکانت کاربر را انجام داده و توکن مورد نظر را منقضی (expire) می کنیم.
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 |
<?php // retrieve token if (isset($_GET["token"]) && preg_match('/^[0-9A-F]{40}$/i', $_GET["token"])) { $token = $_GET["token"]; } else { throw new Exception("Valid token not provided."); } // verify token $query = $db->prepare("SELECT username, tstamp FROM pending_users WHERE token = ?"); $query->execute(array($token)); $row = $query->fetch(PDO::FETCH_ASSOC); $query->closeCursor(); if ($row) { extract($row); } else { throw new Exception("Valid token not provided."); } // do one-time action here, like activating a user account // ... // delete token so it can't be used again $query = $db->prepare( "DELETE FROM pending_users WHERE username = ? AND token = ? AND tstamp = ?", ); $query->execute( array( $username, $token, $tstamp ) ); |
می توانیم یک TTL (time to live) را به صورت ۲۴ ساعته برای بررسی timestamp ذخیره شده در جدول مورد نظر اجرا کنیم .
1 2 3 4 5 6 7 8 9 10 |
<?php // 1 day measured in seconds = 60 seconds * 60 minutes * 24 hours $delta = 86400; // Check to see if link has expired if ($_SERVER["REQUEST_TIME"] - $tstamp > $delta) { throw new Exception("Token has expired."); } // do one-time action here, like activating a user account // ... |
اگر قصد داشته باشیم که url فقط برای ۲۴ ساعت معتبر باشد ، باید از مقدار ۸۶۴۰۰ به ثانیه استفاده کنیم . بنابراین با شرط بالا و مقدار زمان ذخیره شده و ۲۴ ساعت به ثانیه ، معتبر بودن یا نبودن توکن را بررسی می کنیم .
جمع بندی
مثال بالا سناریویی از ارسال لینک فعال سازی برای کاربر بود ، می توانید با ساخت لینک یکبار مصرف در php (OneTime URLs) برای ارایه فایل های دانلودی به کاربر ، همچنین ایجاد محدودیت زمانی برای لینک دانلود استفاده کنید .
همچنین برای بررسی توکن منقضی شده و همچنین حذف آن از جداول دیتابیس ، میتوانید یک اسکریپت جدا برای اینکار بنویسید و آن را را زمان بندی کنید یا اینکه در cron job قرار بدید تا هر چند یک بار اجرا و موارد منقضی شده را از دیتابیس پاک کند .
امیدوارم از آموزش ساخت لینک یکبار مصرف در php در پروژه هایی که می نویسید استفاده کنید و آن را بنابر نیاز خود تغییر و توسعه بدید .
اگر نحوه ارسال فایل به کاربر با یک نام و سرعت دانلود دلخواه را نمی دانید ، می توانید از آموزش ویدیویی ساخت لینک زمان دار php روش انجام کار را به صورت کاملا ساده و عملی یاد بگیرید.
هر مشکلی در پیاده سازی این پروژه داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
سلام ممنون عالی بود
فقط چطوری میتونیم همین کار رو با پایتون انجام بدیم؟
ممنون میشم راهنماییم کنید.
سلام. خوشحالیم که مفید واقع شده
متاسفانه با پایتون کار نکردم
سلام مهندس شفیعی گل من از توکن با مدت زمان معین مثلا یک ساعته برای سیستم فراموشی رمز عبور استفاده کردم ولی میخوام بدونم اگه لینکی که برای کار بر ایمیل میکنیم همیشگی باشه بهتر نیست که هر وقت پسورد رو فراموش کرد استفاده کنه
این کار مشکل امنیتی داره ؟
میشه کمی راهنمایی کنید ؟
سلام مشکلی نداره
سلام و درود
لطفا با من تماس بگیرید آی دی تلگرام
سلام. لطفا بفرمایید در چه مورد نیاز به راهنمایی دارید ؟
اگر زیاد خصوصی نیست همینجا بپرسید پاسخ داده می شود.
سلام میشه این را با روش mysqli هم انجام دهید؟؟
سلام.
این آموزش رو دنبال کنیداتصال به دیتابیس با mysqli
با سلام چگونه کاری کنم که با refresh (بارگزاری تازه صفحه)کد جدید ساخته نشود وآن کد مخصوص همان کاربر باشد؟
سلام. از سیشن می تونید استفاده کنید
آموزش session
موفق باشید.
سلام و خسته نباشید، اگر امکانش هست یک ویدعو آموزشی واسم بزارید که چجوری میتونم لینک یکبار مصرف بسازم، از۰تا ۱۰۰
و توی این لینک من چطور میتونم فرضا چند فتیلو رو قرار بدم و بصورت پکیج کنم و بزارم برای دانلود
سلام ممنون. آموزش کامل ساخت لینک یکبار مصرف برای دانولد فایلها قرار داده شده
https://netparadis.com/generate-onetime-download-link-php/
موفق باشید.
سلام میشه آموزش ساده تر برای افراد مبتدی بزارید!؟!؟!
سلام . بله بفرمایید از این آموزش ویدیویی استفاده کنید
https://netparadis.com/generate-onetime-download-link-php
موفق باشید.
با سلام و درود
اگر از این روش بخواهیم برای لینک دانلود استفاده کنیم آیا به مشکلات زیر برخورد میکنم.
۱ – حجم فایل ها زیاد باشه مثلا بین ۱ تا ۵ گیگ و مثلا روزانه ۱۰۰ نفر هم زمان در خواست دانلود بدن . سرور یا حافظه php کم نمیاره؟
۲ – با این روش کاربر تحت هر شرایطی نمیتواند لینک مستقیم فایل را پیدا کند؟
۳ – برای کاربر بهینه تر از چه سیستم عاملی با چه سخت افزاری استفاده میشه کرد؟
۴ – آیا در این روشی که شما گفتین امکان کد نویسی بهینه تری هست؟
پیشاپیش سپاسگذارم بابت جوابگویتون و آموزش مفیدتون
سلام . جواب سوالات شما و روش بهینه و مناسب در این ویدیوی آموزشی قرار داره .
https://netparadis.com/generate-onetime-download-link-php
موفق باشید.