بإسم الله الرحمان الرحيم
وَمَا كَانَ لِنَفْسٍ أَنْ تَمُوتَ إِلاَّ بِإِذْنِ اللَّه كِتَابًا مُّؤَجَّلاً وَمَن يُرِدْ ثَوَابَ الدُّنْيَا نُؤْتِهِ مِنْهَا وَمَن يُرِدْ ثَوَابَ الآخِرَةِ نُؤْتِهِ مِنْهَا وَسَنَجْزِي الشَّاكِرِينَ
سورة آل عمران الأية 145
السلام عليكم و رحمة الله و بركاته
و أهلا بكم إلى جزء جديد من الدورة أتمنى أن ينال إستحسانكم
كما هو واضح من العنوان سنتطرق في هدا الجزء من الدورة إلى خاصية برمجة (نسيت كلمة المرور)
و التي تفيد الاعضاء في إسترجاع كلمات المرور الخاصة بهم
و الحقيقة أن كلمة المرور المنسية لا يمكن إسترجاعها بسبب عدم وجود فك شفرة md5
لكن بما أن العضو مسجل ببريد إلكتروني فيمكن الإتصال به بريديا و التحقق من رغبتة في الحصول على كلمة مرور بديلة عن الكلمة المنسية
1 - خطة إسترجاع كلمة المرور
عند النقر على رابط (نسيت كلمة المرور) يتم نقل العضو إلى نمودج يطلب منه إدخال إسم المستخدم الدي قام بالتسجيل به
عند إدخال إسم المستخدم يتم إرسال بريد إلى عنوانه الإلكتروني الدي قام بالتسجيل به يحتوي هدا البريد على رابط إدا ضغط عليه يتم تكوين كلمة مرور جديدة و إرسالها إلى بريده الإلكتروني
2 - الخطة البرمجية
سنحتاج إفتراضيا إلى ثلاث صفحات
_ صفحة نمودج كتابة إسم المستخدم المراد إسترجاع كلمة المرور الخصة به
_ صفحة إرسال بريد الحقق إلى البريد الإلكتروني
_ صفحة إنشاء كلمة مرور جديدة و إرسالها إلى البريد الإلكتروني للمستخدم
جدول البيانات الؤقتة سنستخدمه لحفظ الكود السري المستخدم في التحقق و يتم إستدعائه إلى الصفحة عن طريق تمريره إلى مصفوفة GET
3 - البرمجة
الأمور البديهية و المتطلبة سابقا لن أقوم بشرحها كجدول الأعضاء فهدا من المفترض أن يكون لديك مسبقا
ولكن سأعمل على أمثلة جاهزة
جدول الأعضاء إفتراضيا بهده البنية

و الإسم الإفتراضي للجدول هو azizsoft_usr
أول ما سنقوم ببرمجته هو نمودج طلب كلمة المرور
و هو نمودج بسيط جدا يحتوي على حقل واحد هو خقل غسم المستخدم و زر الإرسال
و الإسم الإفتراضي للحقل هو usrname

و الصفحة التي ستستقبل النمودج هي p_pass.php

<<لست مضطرا لإستخدام هده الأسماء بالظبط للملفات و المتغيرات لكن إحرص على أن يكون الإسم هو نفسه في جميع الخطوات>>
لنبدأ ببرمجة الملف الدي سيستقبل إسم المستخدم من النمودج و هو p_pass.php
تخزين إسم المستخدم القادم من النمودج في متغير و الإستعلام عنه في قاعدة البيانات
كود PHP:
$usrname = $_POST['usrname'];
$query=mysql_query("SELECT usrname,email FROM `azizsoft_usr` WHERE `usrname`='$usrname'");
ربما يقوم العضو بإدخال إسم مستخدم غير موجود لدا لابد من التحقق من أن الإسم المدخل موجود في قائمة الأعضاء
كود PHP:
if(mysql_num_rows($query)!=1){
die("خطأ .إسم المستخدم الدي أدخلته غير صحيح");
}
بعد تجاوز هدا الشرط نأتي إلى إستخراج البريد الإلكتروني الدي إشترك به العضو و دلك بهدف إرسال كود التحقق
لهدا الغرض نستخدم دالة mysql_fetch_array التي ستضع لنا محتويات السجل في مصفوفة
كود PHP:
$result = mysql_fetch_array($query);
تم إستخراج البريد الإلكتروني من الحقل email
كود PHP:
$email = $result['email'];
لنتدكر جيدا
البريد الإلكتروني وضعناه في متغير
لكن مدا سنرسل له؟؟
الجواب بسيط
رابط صفحة ليكن إسمها إفتراضيا هو c_pass.php
و هده الصفحة يجب أن تكون مرتبط عن طريق مصفوفة GET بـــ
إسم المستخدم و
كود عشوائي سري هو كود التحقق من رغبة العضو في إنشاء كلمة مرور جديدة
هدا الكود سنحتفظ به في جدول البيانات المؤقتة
لننشئ اولا الكود العشوائي عن طريق الدالة التالية
كود PHP:
function rand_string($num_chars){
$chars=array("a","A","b","8","B","c","C","9","-","d","D","0","e","1","E","f","F","g","G","h","2","H","i","I","j","J","k","3","K","7","l","_","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","4","S","t","T","u","U","6","v","V","w","W","x","5","X","y","Y","z","Z",);
$string=array_rand($chars,$num_chars);
foreach($string as $s){
@$ret.=$chars[$s];
}return
$ret;
}
هده الدالة إستخدمناها في الجزء السابق و طريقة عملها معروفة
لننشئ الكود السري بواسطتها
كود PHP:
$crc = rand_string(30);
هناك نقطة مهمة يجب عدم إغفالها
الكود السري الدي ننشئه يجب أن يكون محدودا في فترة صلاحيته و إلا فإن المستوى الأمني للموقع سيكون في الحضيض
لنجعله إدا صالحا للإستخدام لمدة اسبوع إنطلاقا من تاريخ إنشائه
مع العلم أن 24 ساعة هي فترة صلاحية كافية
عدد التواني في الاسبوع الواحد هو 604800
إدن
كود PHP:
$time = time()+604800;
لدينا إلى حد الان 4 متغيرات جاهزة و هي كالتالي
البريد الإلكتروني $email
إسم المستخدم $usrname
الكود العشوائي السري $crc
تاريخ الصلاحية $time
إدا أردنا حفظ هده المعلومات في جدول البيانت المؤقتة فيجب أن نفرق بينها و بين المدخلات السابقة عن طريق الحقل tmp_type
لنجعل قيمة هدا الحقل هنا هي p_pass
ملاحضة أخرى . حقل tmp_ip لن نحتاجه هنا إد لا دور له لدا سنتجاهله
أضن أننا الان في وضع مناسب لإدخال البيانات إلى الجدول azizsoft_tmp
كود PHP:
mysql_query("INSERT INTO `azizsoft_tmp`(`tmp_type`,`tmp_crc`,`tmp_time`,`tmp_usr`)VALUES('p_pass','$crc','$time', '$usrname');");
طبعا لا ننسى الرسالة الموجهة للبريد الإلكتروني $email
و أهم ما يجب أن تتوفر عليه الرسالة هو رابط الصفحة التي ستقوم بإنشاء الباسوورد الجديد
إسم الصفحة إفتراضيا هو c_pass.php
و يجب أن يتم إرساله كما دكرنا سابقا مرتبطا بعنصرين
الكود العشوائي السري $crc و إسم المستخدم $usrname
إدن
كود:
"c_pass.php?crc=".$crc."&usr=".$usrname
و لا ننسى ربط الصفحة بالمسار الكامل لها تم دمجها في رسالة واضحة اللهجة مفهومة المقصد إلى العضو
كود PHP:
$msg = "بإسم الله الرحمان الرحيم
السلام عليكم و رحمة الله و بركاته
أنت أو شخص اخر قام بطلب كلمة المرور للعضوية ".$usrname."
لإستعادة كلمة المرور يرجى الضغط هلى الرابط التالي
http://_______/c_pass.php?crc=".$crc."&usr=".$usrname."
إدا لم تكن أنت من طلب كلمة المرور يمكنك حدف هده الرسالة
مع تحيات إدارة الموقع";
تم نأتي إلى عملية إرسال الرسالة إلى البريد الإلكتروني $email عن طريق دالة mail
كود PHP:
mail($email, "رابط إسترجاع كلمة المرور", "$msg", "From: azizsoft <azizsoft@gmail.com>\r\n");
و لا ننسى إعلام المستخدم أن دلك تم بنجاح
كود PHP:
echo "تم إرسال رابط إسترجاع كلمة المرور الى بريدك الإلكتروني";
إنتهينا من برمجة ملف إنشاء رابط إسترجاع كلمة المرور
أما الصفحة التي يتم إرسالها بواسطة الملف فهي بإسم c_pass.php كما رأينا سابقا و سنبدأ على بركة الله ببرمجتها
لنبدأ بحفظ محتوى مصفوفة GET في متغيرات
كود PHP:
$usr = $_GET['usr'];
$crc = $_GET['crc'];
أيضا نحتاج إلى التاريخ الحالي لمعرفة إدا ما كان الرابط ما زال صالحا أم لا
إستعلام جدول البيانات المؤقتة بنائا على المتغيرات السابقة
كود PHP:
$query=mysql_query("SELECT * FROM `azizsoft_tmp` WHERE `tmp_type`='p_pass' and `tmp_crc`='$crc' and `tmp_usr`='$usr' and `tmp_time`>'$time'");
إدا لم يرجع الإستعلام سجلا في قاعدة البيانات بالمتغيرات السابقة فبالتأكيد الرابط خاطئ و يجب ان نتوقف عند هدا الحد مخبرين المستخدم بدلك
كود PHP:
if(mysql_num_rows($query)!=1){
die("رابط خاطئ");
}
إدا تم إجتياز الشرط بنجاح نأتي إلى إستخراج البريد الإلكتروني للمستخدم $usr من جدول الأعضاء
كود PHP:
$query2=mysql_query("SELECT usrname,email FROM `azizsoft_usr` WHERE `usrname`='$usr'");
$result2 = mysql_fetch_array($query2);
$email = $result2['email'];
الأن لدينا البريد الإلكتروني و إسم المستخدم
لم يبق لنا إلا تحديث كلمة المرور الخاصة به و إرسالها إليه عن طريق البريد
لا تنس دكر الله
تم لا تنس أن كلمة المرور يجب أن يتم إرسالها إلى البريد بسياقها العادي و تحديتها في جدول الأعضاء مشفرة بـــ md5
لدا سنحتاج إلى استخراج كلمة المرور عشوائية من دالة rand_string و تشفيرها بــ md5
كود PHP:
$newpass = rand_string(8);
$newpassmd5 = md5($newpass);
المتغير $newpass هون كلمة المرور الدي يتوجب علينا إرسالها إلى البريد و $newpassmd5 هو تشفير كلمة المرور الدي يجب أن يتم وضعه في حقل كلمة المرور للعضو
تحديث كلمة المرور الخاصة بالعضو في جدول الأعضاء طبعا يجب أن تكون مشفرة
كود PHP:
mysql_query("UPDATE `azizsoft_usr` SET `password`='$newpassmd5' WHERE `usrname`='$usr';");
تجهيز الرسالة ووضع كلمة المرور الجديدة فيها
كود PHP:
$msg = "بإسم الله الرحمان الرحيم
السلام عليكم و رحمة الله و بركاته
تم إنشاء كلمة مرور جديدة لعضويتك
كلمة المرور الجديدة هي
".$newpass."
مع تحيات إدارة الموقع";
إرسال الرسالة
كود PHP:
mail($email, "كلمة المرور الجديدة", "$msg", "From: azizsoft <azizsoft@gmail.com>\r\n");
إعلام المستخدم بإرسال الرسالة
كود PHP:
echo "تم إرسال كلمة المرور الجديدة إلى بريدك الإلكتروني<br>شكرا";
إعدروني على اي تقصير في الشرح و إدا عندكم اي ملاحضات حول الموضوع لا تبخلو بها و جزاكم الله خيرا
و السلام عليكم و رحمة الله و بركاته