الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ثغرة اختراق اليوزر والباسوورد فى php login فاحذروها

مغلق
بدأه bakrmohamed84 في 3 أغسطس 2006 · 10 رد · 5,788 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

حاجة مهمة جداً وقعت فيها وحبيت أقدمها لكم وهى الحماية من اختراق كلمات السر والباسوورد الخاصة بنموذج اللوج أن الخاص بك

ابدأ معايا الكلام واحد واحدة

لو عندنا كود نموذج لوج إن هكذا

<form method="post" action="login.php">
<input type="text" name="username">
<input type="password" name="password">
</form>

وكانت جملة ال SQL هكذا

"SELECT id
FROM logins
WHERE username = '$username'
AND password = '$password'";

فلو أننا افترضنا أن اليوزر هى bakr

وقمنا بادخال الباسوورد هكذا

anything' OR 'x'='x

طبعاً ستكون النتيجة أن جملة السيكول ستكون بهذه الصورة

"SELECT id
FROM logins
WHERE username = 'bakr'
AND password = 'anything' OR 'x'='x'";

وعناه أن افتح لوكان اليوزر يساوى اليوزر ... وهذا تحقق فعلاً

و الباسوورد تساورى أى حاجة aything أو أن ال x = x

وطبعاً ال x تساوى نفسها

والناتج أن الموقع هيفتح

والمشكلة دى ممكن يكون فيه ناس كتير واقعين فيها

والحل ياجماعة هو أننا قبل أن نستخدم الباسوورد نقوم بتشفيرها هكذا

$password=md5($password);

وهذه هى المستخدمة فى المنتيات والأنظمة الكبيرة

أرجو عدم الاستخدام بطريقة سيئة وأن تنتفعوا بها ولا تضروا بها والله يعلم نيتى فى هذا

ومن قام ببرمجة أى موقع وارتكب هذا الخطأ فعليه أن يقوم بما قمت به من إصلاح هذا الخطاً

والحرص من أى input text مدخل من المستخدم لأنه ممكن أن يكتب فيها أوامر sql وغيرها مما قد يسبب مشاكل

وعلى فكرة الموضوع ده خاص بكل اللغات مش ال php فقط لأنها خاصة بجمل ال sql وطبعاً على اختلاف الطريقة وشكل الأمر

دعواتكم

نعيب زماننا والعيب فينا ****** ومالزماننا عيب سوانا

اللهم أعز الإسلام والمسلمين

#2

مشكور اخي علي اهتمامك أفادت اخوتك في المنتدي ولكن بهذا الشكل لم تغلق الثغرة

لا يهم الباسورد الان لان بقيت الجمله تلغى الباسورد نهائيها فمعنى الجمله الان لو كان هذا اليوز اسمه كذا وباسورده كذا او واحد تساوي واحد ادخله جملة الاختراق هي 1=1

ولكن ما حل هذه المشكلة

ان تمرر المدخلات علي الدالة التالية وهي تحمك من خطر الانجكت سكول

mysql-escape-string

هذا هو اللنك تبعها

http://www.php.net/manual/en/function.mysq...cape-string.php

يابن ادم ولدتك امك باكياً والناس حولك سروراً فعمل لي يوم اذا بكوا في يوم موتك ضاحكاً مسروراً

اطلب اي ملف Testking او كتاب من كتب ميكروسوفت في اي مجال

#3

أخى جزاك الله خير على التفاعل ولكن أنا كنت أقصد أن أضع أبسط الحلول وأفضلها تقريباً

<? 
$text1="bakr";
$text2=md5($text1);
echo "$text2";
?>

يعنى قبل ما تدخل المتغير فى جملة السيكول قم بتشفيره وأدخل الناتج

مثلاً ناتج كلمة bakr

هو

277add45f831355e9453b41e651f6411

وطبعاً مهما كان هناك أوامر أو علامات ففى النهاية بتدخل بالطريقة المشفرة دى كأنها string جديد

ودا ما يتم اتباعه فى المنتديات

وع العموم الحلول كتير ولكن ده أبسطهم وأسرعهم وأظنه أفضلهم

نعيب زماننا والعيب فينا ****** ومالزماننا عيب سوانا

اللهم أعز الإسلام والمسلمين

#4

شكرا على الطريقة وهيا فعلا تستخدم فالمنتديات

انا استخدم طريقة اخري لكن مش افضل منها :D بس جهنمية :lol:

#5

الأخ abkareno قصد من كلامه أنه سوف يتم اهمال الـ Password في حالتك لماذا . لوجود الشرط الأخر

في الإستعلام وهي OR 'x'='x .

والحل الأفضل كما ذاكر الأخ abkareno . وهناك العديد ولكن تتطلب معالجات اخرى .

والأفضل هوا ان اتقوم بجلب اللإستعلام من قاعدة البينات وبعد ذلك تقوم بالتحقق من ما تم إرجاعة وهوا اسم المستخدم وكلمة المرور . وتقارنها مع النموذج POST.

بمعنى مرر الإستعلام طبيعي . سوف يعيد لك الإستعلام نتاج من قاعدة البينات وهي تمثل اسم المستخم وكلمة المرور . قم بمقارنة ما تم ارجاعة مع ما تم ارسالة من النموذج وبالتالي فلو حصل اي اختراق لجملة الإستعلام سوف تزيد الأمان بعملية المقارنة في PHP .

#6

السلام عليكم

:rolleyes: :rolleyes:

اضيف اقتراح او حل بسيط ويريح راسك من كل هالدوشة

شفر اسم المستخدم

وبعد ان تاخذ النتيجة قارنها مشفرة بالقيمة

وكدا شو ما اكن من النص يجي استعلامات كلها تطير وتتحول الى سلسلة مشفرةة

عيبها الوحيد انها بتسوي شوي ضغط لانو كما تعرفون ان التفير بهذه الدالة يسوي ضغط شوي لما تكتر الاستعلامات

اللهم لا علم لنا الا ما علمتنـــــــــــــــــــــــا

http://dwal.biz

#7

and u can use another thing like addslash

so it will never hacked

tariq shadid

#8

مع لغة برمجة Perl نستخدم Placeholders وهي علامة الإستفهام ؟

$sth=$dbh->prepare("SELECT 1 FROM table1 WHERE username = ? AND password =?") or die $!;
$sth->execute($uname,$pword);

علامة ال؟ الاولى تاخذ من المتغير الأول في execute والثانية تاخذ المتغير الثاني..

بالنسبة لتشفير الكلمة السرية من خلال md5 فهذا فقط يشفر الكلمة السرية المرسلة من الخادم إلى قاعدة البيانات وليس من المستخدم إلى الخادم

إذا نفعتك أحد مشاركاتي فأدع بظهر الغيب لوالداي بالصحة والسلامة والسعادة وطول العمر وأن يكون هذا زيادة لهما في كل خير.

post-21836-1257612765.gif

before asking: smart questions how-to

#9

اعتقد ان الكود ده بسيط و يحل المشكله

<?
 $user_name   =	 $_POST['name'];
 $password	  =		   $_POST['pass'];

$db = mysql_connect ( "localhost","root","");
//اختيار قاعده البيانات التى سيتم التعامل معها 
mysql_select_db("fasterway",$db); 
$result = mysql_query ( "select userpass from users where userid = '$user_name' ");
//وضع البيانات فى مصفوفه بناء على مقبض الاستعلام
$row = mysql_fetch_array($result);
if ($row[0] == $password ) {
echo "welcome : " . $user_name;
}else{
echo "incorrect  password  or  id ";
}
?>
#10

أخي half angel : كودك جيد .

عند بناء الإستعلام انضر ما ذا كتبت

select userpass from users where userid = '$user_name'

سيعد الإستعلام عند تنفيذه الحقل userpass طيب متى سيعيد هذا الحقل عندما user_name = userid$ .

طيب شوف وجدود المتغير بين العلامتين '' فلو قمت بكتابه التالي في نموذج الإرسال :

اسم المستخدم سوف اكتب ما يلي :

 fawaz  ' or 'x' = 'x

ليكون تنفيذ الإستعلام كما يلي

select userpass from users where userid = 'fawaz ' or 'x'='x'

وبالتالي الشرط الأول والذي هوا 'userid = 'fawaz لن يتحقق لأن اسم المستخدم غير صحيح طيب واصل قراءة الإستعلام سوف تجد الشرط الأخر وهوا بمعنى أو أن القيمة x تساوي نفسها x وهذا الشرط صحيح إذا بهذا الشكل سوف يأخذ المفسر الخاص بقاعدة البيانات الشرط الأخر لعدم توفر الشرط الأول وبالتالي سوف يعيد الإستعلام الحقل userid وعليه لو قمت بعمل مقارنه بين ما تم إدخالية من المستخدم بالذي تم ارجاعة من قاعدة البيانات سوف يكون ما يلي :

لو اعيد لي القيمة مثلاً ali فهل ما كتب المستخدم يساوي القيمة التي اعيدت بالطبع لا لأن ما قام المستخدم بإدخاله هوا :

 fawaz  ' or 'x' = 'x

وبالتالي سوف تقوم صفحة التحقق من الإدخال بعد المعالجة من قبل المبرمج مثلا ان تكتب غير مصرح لك بالدخول او الجملة التي تحلو لك .

وهذا ما قصدة في المشاركة السابقة . قام الأخ half angel مشكور بتوضيح الفكرة بالكود .

والأفضل ايضا ان نستخدم addslash كما اشار لها الأخ shadidonline حتى نتخلص أيضا من المشاكل الأخرى

#11
$user_name = addslashes($_GET['username']);
$user_pass = addslashes($_GET['userpass']);

$get_user = @mysql_query("SELECT * FROM `userlist` 
	WHERE `username`='$user_name' AND `userpass`='$user_pass'");

مع السلامة

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…