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

ما معنى SQL injection

رائج
بدأه Xacker في 14 أكتوبر 2008 · 37 رد · 24,548 مشاهدة · في قسم أمن المعلومات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم،

1/ ما معنى SQL injection

  • إدخال (حقن) تعليمات SQL في قاعدة بيانات موقع ما من خلال ضعف أمني في برمجة الموقع بأخذ معلومات أو قيم مرتجعة من قبل المستخدم من الصفحة بدون فحصها بحثاً عن الرموز الممنوعة والتي قد تسبب خللاً في الجمل الخاصة بـ SQL عندما يتم إدخال هذه القيم في الحقول المخصصة في قاعدة البيانات.
  • SQL injection يمكن أن يحدث في أي مكان يقوم باسترجاع بيانات من المستخدم، أو يعتمد على قيم معينة يعتبرها المبرمج ثابتة في الصفحة، بينما في حقيقة الأمر يكون المهاجم قد قام بتبديلها بقيم أخرى معتمداً على أن المبرمج قام بإغفال هذه النقطة من خلال حفظ الصفحة لديه وإعادة تشكيلها مرة أخرى reconstruct بقيم مختلفة عما وضعه المبرمج، مثال: استخدام قائمة drop down لعرض مجموعة من الألوان والطلب من المستخدم اختيار لونه المفضل، يمكن للمهاجم حفظ الصفحة وإعادة كتابة شئ مختلف بدلاً من القيم بنفس الـ id المحدد للعنصر.
  • SQL injection يتنوع بين السهل الاستغلال وبين المعقّد الاستغلال.
  • يمكن إعطاء المثال البسيط التالي: جملة SQL في صفحة login.php تقوم باختيار عضوية من جدول بناء على وجود اسم مستخدم في هذا الجدول وتطابق كلمة المرور مع الحقل المناسب
    SELECT id FROM users WHERE name='$name' AND pass='$pass';

وفي الصفحة التي تظهر للمستخدم يوجد نموذج FORM بالشكل التالي:

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

عند النقر على زر Submit فإن النموذج يقوم بإرسال قيم الحقول name و pass إلى الصفحة login.php التي تحوي على جملة SQL السابقة.

لو قام المهاجم بإدخال النص التالي كاسم مستخدم (نفرض وجوده في الجدول):

admin

وقام بإدخال كلمة مرور بالشكل:

' or 1=1;--

فما يحصل هو أن القيم أعلاه سيتم إضافتها ضمن جملة SQL كقيم متغيرات لتصبح الجملة أثناء التنفيذ بالشكل التالي:

SELECT id FROM users WHERE name='admin' AND pass='' OR 1=1;--';

لاحظ كيف أنه يتم نفي احتمال كون كلمة السر فارغة من خلال استخدام الشرط المنطقي OR

وتبديله بعبارة محققة دوماً، 1=1

من ثم إدخال ; والتي تعني نهاية الجملة الشرطية

من ثم -- التي تعني اعتبار كل ما يليها كتعليق لا يتم أخذه بعين الاعتبار أثناء التنفيذ (لتجنب الأخطاء التي قد تظهر في جملة SQL معقدة أكثر)

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

يمكن استغلال SQL injection للحصول على صلاحيات، لسرقة جداول كاملة قد تحوي على بيانات شخصية أو بيانات هامة وسرّية (بطاقات الائتمان في موقع تجاري) والعديد من الأمور الأخرى.

<li>بما أن جمل SQL لا تظهر للمهاجم وتختلف من موقع لآخر فيكون هناك عمل ينتظر المهاجم في كتابة استغلالات أكثر تعقيداً من المثال أعلاه للحصول على صلاحيات أو بيانات ما من جدول معين، فمجرد عدم الحصول على اسم الجدول يمنعه من الحصول على المعلومات الموجوده بداخله لذلك يلجئ المهاجم إلى إدخال استغلالات خاطئة عند التنفيذ تحدث خطأ معالجة تجعل السيرفر يقوم بتلفّظ معلومات لمحاولة توضيح الخطأ وسبب حصوله، غالباً ما تحوي هذه الأخطاء على معلومات مهمة للمهاجم كأن يظهر الخطأ التالي:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35

في استغلال خاطئ ( ' having 1=1-- ) يمكن المهاجم من معرفة الجدول والـ column الذي يعمل فيه ومعلومات أخرى أيضاً مثل GROUP BY التي قد تساهم في توسعة دائرة المعرفة الخاصة به!

blind SQL injection هو أحد الأنواع عندما يقوم مدير الموقع بتعطيل إظهار معلومات نتيجة استعلامات خاطئة، فلا يظهر شئ للمهاجم، حينها يكون عليه أن يقوم بعمل أكثر وربما يكون من المستحيل بالنسبة له الحصول على نتيجة عندما تفشل محاولاته جميعها في إعطائه ما يريد.

تم تعديل هذه المشاركة بواسطة Xacker في 14 يناير 2011 في 03:48 — السبب: تصحيح عرض كود

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

لاحظ يا X لو كتب الإستعلام بهذا الشكل الغريب :

$name=$_POST['user'];
$pass =$_POST['passwd'];

$qu = "SELECT * FROM users WHERE name='".$name."'" ;

$member  = mysql_fetch_array(mysql_query($qu));

if ($member AND $member['password'] == $pass )
{
... etc

ستصبح مشكلة أمام ال injection ! هل يمكن الإلتفاف عليها ؟ طبعا لايوجد إختلاف في الأداء فيما لو كان الإستعلام مجرد سطر واحد :

SELECT id FROM users WHERE name='$name' AND pass='$pass';

تم تعديل هذه المشاركة بواسطة Xacker في 23 ديسمبر 2012 في 14:14

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

أنت أدرى مني بـ SQL

المشكلة واضحة

لكن كيفما كان شكل الاستعلام، ألا تجد أن المشكلة في النهاية هي في ما يتضمنه اسم المستخدم وكلمة المرور وليس فعلاً ما يكون شكل الاستعلام؟

بمعنى لو قمت بفحص المتغيرات $name و $pass بعد أن تجلبها من الاستعلام وقمت بمسح كل الرموز الممنوعة فيها ثم تنفذ بقية الاستعلامات ألا يحل هذا المشكلة أم هناك شئ تلمّح له غفل عني؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

لا يا X قصدت أن إنتبه للتفرع الشرطي هنا :

if ($member AND $member['password'] == $pass )

لو حاولت أن تقوم بعمل Injection بأي طريقة ولأي password لايمكن تخطي هذا الكود , والسبب أن المقارنة هنا تتم على مستوى If في الكود نفسه وليس في RDBMS Server , وحدث ذلك بالجملة المهمة جدا :

$member  = mysql_fetch_array(mysql_query($qu));

والتي ستقوم بإستقبال جميع ال fields من mysql server لذلك السجل الذي فيه username مدخل , ومن هذه الحقول حقل ال Password , بالتالي هنا أنا لن أسمح أساسا بأن تكون هناك إمكانية لتخطي هذا الكود بعمل SQL Injection لأن كود إختبار الباسورد ببساطة لن يدخل في RDBMS وينفذ ;)

عموما ذكرت المثال فقط لأعرف هل هناك إمكانيات أخرى ...

تم تعديل هذه المشاركة بواسطة Xacker في 23 ديسمبر 2012 في 14:16

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

وماذا عن

$pass =$_POST['passwd']; // passwd = 1 OR 1=1

طالما لا أستطيع أن أجرب هذه الأمور بسهولة، أخبرني أنت كيف يكون شكل التنفيذ أساساً في جملة IF؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

نفرض أن كلمة المرور واليوزر الحقيقيين :

hgb

123456

نفرض البيانات المدخلة كانت :

$name=$_POST['user']; // = 'hgb'
$pass =$_POST['passwd']; // = '1 OR 1=1'

جملة If الحقيقية :

if ($member AND $member['password'] == $pass)

جملة If في التنفيذ ستكون هكذا :

if (true and '123456' ==' 1 OR 1=1')

القيمة true ظهرت من أن هناك مدخل في الجدول بإسم متغير username=hgb من هذا السطر

$member  = mysql_fetch_array(mysql_query($qu));

ثم تم تحميل قيم الحقول جميعها لليوزر hgb في المصفوفة member أيضا , من هنا في خانة $member['password'] ستكون القيمة 123456 الحقيقة لتتم مقارنتها مع ' 1 OR 1=1' , بالتالي لن يتحقق شرط If مهما أدخلت إلا بأن تدخل القيمة من البداية صحيحة 123456 في $_POST['passwd'] .

تم تعديل هذه المشاركة بواسطة Xacker في 23 ديسمبر 2012 في 14:18

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

أخبرني أولاً، عندما تقوم بكتابة $pass ضمن الشرط فيتم استبدالها بالقيمة المدخلة + الـ single quotes بشكل اوتوماتيكي دون أن تقوم بكتابة الشكل الآخر

 AND $member['password'] == '.$pass.'

؟؟

سأتابع معك بعد أن تؤكد أو تنفي ما ورد أعلاه فهو يغير الكثير ولم أقم بهذه الأمور منذ وقت طويل.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

لا يا X لايتم وضع single quotes بشكل آلي , وإنما وضعتها أنا لتوضيح المقارنة النصية التي ستكون ...

والقيمة التي ستمرر تعتمد على نوع قيمة POST التي وضعت من الأساس في ملف html مثلا , ولتكن على الشكل :

<input type="text" name="password" size="20">

لاحظ في input type ... ولايمكن أن تكون غير TEXT هنا بقية الأنواع :

type = text|password|checkbox|radio|submit|reset|file|hidden|image|button

لذلك يجب أن تكون المقارنة نصية في هذه الحال ! ولو أدخلت أي شيء في مكان password field سيظهر كما هو وقت المقارنة .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#9

السلام عليكــم ورحمـة الله وبركاتــة

الكود الذى وضعه أخى هيثم بالفعل قوى( لحماية الدخول الغير مصرح به ) لأن الشرط كما ذكر أخى هيثم يتم على مستوى الphp و ليس فى جملة ال sql

و لكن ....

إذا كان يطبع أى شئ من مخرجات جملة ال select الأولى يمكن إستغلال هذا بإستخدام union all و عرض محتويات جدول آخر

أو أخطر من هذا , فإذا كان اليوزر لديه صلاحية , فما المانع من وضع

; DROP TABLE users; --

مكان اليوزر نيم

أو أى جملة آخرى ك Insert مثلا

أو إستخدام ال xp_cmdshell فى الSQLServer

ملخص كلامى أنه يجب فلترة المدخلات قبل وضعها فى جمل ال mysql فالحيل كثيرة جدا

تم تعديل هذه المشاركة بواسطة net_code في 24 أكتوبر 2008 في 19:33

لا تراجع و لا إستسلام

#10
function GetSQLValueString($theValue, $theType) {
  if (!$theValue) return '';
  if (!$theType) $theType = gettype($theValue);
  switch ($theType) {
	case "string":
	case "blob":
	case "text":
	  //$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
	  $theValue = ($theValue != "") ? "'" . mysql_real_escape_string($theValue) . "'" : "NULL";
	  break;	
	case "password":
	  //$theValue = ($theValue != "") ? "'" . md5($theValue) . "'" : "NULL";
	  $theValue = ($theValue != "") ? "'" . sha1($theValue) . "'" : "NULL";
	  break;	
	case "int":
	  $theValue = ($theValue != "") ? intval($theValue) : "NULL";
	  break;
	case "double":
	  $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
	  break;
	case "timestamp":
	case "datetime":
	case "date":
	  $theValue = ($theValue != "") ? "'" . $theValue . "'" : " NOW( ) ";
	  break;
  }
  //debug ('GetSQLValueString', $theValue.'='.$theType);
  return $theValue;
}

$name= GetSQLValueString($_POST['user'], 'text');
$pass =GetSQLValueString($_POST['passwd'], 'password');

?>

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 24 أكتوبر 2008 في 20:59

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#11

فعلاً كلامك صحيح H، إخراج المدخلات من استعلام SQL يلغي الخطر تماماً مع الأخذ بعين الاعتبار ما ذكره الأخ أبو محمد.

الموضوع أخذ مني بعض الوقت حتى استوعبت ما تحاول قوله

لست على ما يرام هذه الأيام.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

إضافة للموضوع :-

يمكن تلخيص الحماية من ال sql injection أو الحد من حيل ال sqlinjection

1- منع ال error reporting أى منع البرنامج من أن يخرج أى رسائل خطأ و بهذا لن يستطيع المخترق الحصول على أى معلومات توصله إلى أسماء الجداول أو الحقول الخاصة بقاعدة البيانات و لن يبقى أمامه إلا التخمين ( مثلا : اسم جدول الأعضاء users , members , customers ,.....) و هنا يأتى دور ال table prefix

2- إستخدام ال table prefix و هى أن تضع حرف أو حرفان فى بداية إسم الجداول ( بهدف عدم تعارض أسماء الجداول إذا كنت تتعامل مع عدة برامج على قاعدة بيانات واحدة و لكننا سنستخدمها هنا للحماية )

مثلا بدلا من جدول users يصبح ex_users ( على قدر المستطاع إبتعد عن أن يكون ال prefix أول حروف من إسم الموقع أو السكريبت لأنه أول شئ يخطر على بال المخترق فى التخمين )

3- فلترة المدخلات بإستبدال مثلا الكلمات الضارة مثل drop أو select أو عمل escape مثلا أو أى طريقة بحيث تحد من أمكانية التلاعب فى المدخلات ( كود الأخ أبو محمد رائع فعلا أعجبنى جزء الباسوورد جدا و لكن لى عودة إن شاء الله مع الكود )

#

اقتباس
# POST Method هي الوحيدة التي قد تسبب مشكلة ما إن وجد هذا الضعف الأمني لأنها الوحيدة التي تستطيع أن تقوم بتغيير شئ ما على السيرفر، بخلاف GET.

آسف يا Xacker و لكنى لم أستوعب هذه النقطة ؟؟

لا تراجع و لا إستسلام

#13
net_code كتب:
آسف يا Xacker و لكنى لم أستوعب هذه النقطة ؟؟

خطأ مني، شكراً على التنبيه - كلا POST و GET يمكن استخدامهم في SQL.

مثال على GET;

تم تعديل هذه المشاركة بواسطة Xacker في 27 أكتوبر 2008 في 00:28

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14
اقتباس
خطأ مني،

القليل من يعترف ، وهذا يدل على معدن الصدق والكثير من يلف ويدور .

أيضاً من الفوائد في هذا الجانب

define("ISMQ" ,get_magic_quotes_gpc());
$post = array();
if (count($_POST) > 0 ) {
	foreach( $_POST as $key => $value) {
		$value =  trim($value);
		//if (empty ($value)) continue;
		if (intval($value)>0) $post[$key] = intval($value);
		elseif (strlen($value)>0) {
			$post[$key] = (ISMQ) ? $value : addslashes($value);
		}
	}
	unset ($key, $value);
}

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#15

قرأت الدرس ،،

اشكرك X على الدرس الرائع ،،

يعني واحد يتعلم شوي افضل مما يبقى .. مثل الاطرش بالزفة :lol:

صار زمان لم اقرء دروسك .. منذ ايام دورت الاسمبلي B)

لو اردت ان اتعلم بهذا المجال ..

بأي الكتب ابدء؟

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#16
اقتباس
بأي الكتب ابدء؟

على ما أظن أنه لا يوجد كتب في هذا المجال, ابحث في Google وستجد الكثير من الامثلة الرائعة لتعلم هذا الشيئ, ايضا أنصحك بتعلم SQL أو ليس تعلم و إنما أحتراف كي تستطيع التعامل مع كافة الحالات, و السلام عليكم

تم تعديل هذه المشاركة بواسطة Wael Dalloul في 5 نوفمبر 2008 في 12:17 — السبب: خطأ إملائي

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#17

هناك كتب في حماية تطبيقات الويب (بالتالي تتعلم !حماية تطبيقات الويب :lol:) لكن للأسف أنا لا أحفظ أسماء الكتب بشكل دقيق وغالباً أقرأ من المواد المنشورة كمحاضرات أو ما شابه. سأنظر عندي عند توفر الوقت عن بعض الأسماء علّي أجد ما يفيد (والوقت ضيّق جداً علي للتنويه).

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#18
اقتباس
والوقت ضيّق جداً علي للتنويه

كان الله في العون .. جالس تقتل ذبان (بعوض) :lol:

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 6 نوفمبر 2008 في 15:46

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#19
الاخير زمانه كتب:
كان الله في العون .. جالس تقتل ذبان (بعوض) :lol:

من وقت لآخر نعم :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#20
Xacker كتب:
من وقت لآخر نعم :)

طبعا انا امزح فقط ،، :wink:

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#21

السلام عليكم

اخى العزيز اكس

موضع ممتاز فعلا و شكرا لك عليه و شكرا لاخوة فى التفاعل

و رايد ان اعرف شئ انا استخدم فى عمليه الاضافة : امر

 

اقتباس
db.Execute (str_insert)

فعل هذا مامن .. حيث انى اضف بالكود الاتى :

str_insert="insert into cust_info(cust_name,cust_nationalty,cust_city,cust_birthday,cust_marig_
date,cust
_salary,cust_tel_home,cust_tel_mobile,cust_tel_work,cust_tel_fax,cust_company,cu
s
t_job,cust_address,cust_sadba,cust_zipcode,cust_email,cust_add_date) values ("
                        str_insert=str_insert+"'"+var(0,0)+"'," ' name
                        str_insert=str_insert+"'"+var(0,1)+"'," ' nationail
                        str_insert=str_insert+"'"+var(0,2)+"'," ' city
                        str_insert=str_insert+"'"+var(0,3)+"',"      ' birth
                        str_insert=str_insert+"'"+var(0,4)+"',"      ' maruage
                        str_insert=str_insert+"'"+var(0,5)+"'," ' sal
                        str_insert=str_insert+"'"+var(0,6)+"'," ' tel home
                        str_insert=str_insert+"'"+var(0,7)+"'," ' tel mobile 
                        str_insert=str_insert+"'"+var(0,8)+"'," ' tel work
                        str_insert=str_insert+"'"+var(0,9)+"'," ' tel fax
                        str_insert=str_insert+"'"+var(0,10)+"',"' company
                        str_insert=str_insert+"'"+var(0,11)+"',"' job
                        str_insert=str_insert+"'"+var(0,12)+"',"' address
                        str_insert=str_insert+"'"+var(0,13)+"',"' sad
                        str_insert=str_insert+"'"+var(0,14)+"',"' zip
                        str_insert=str_insert+"'"+var(0,15)+"',"' email
                        str_insert=str_insert&add_date
                        str_insert=str_insert+")"
 
                        'test code
                        'response.write(str_insert)
                        'add the row
 
                        db.Execute (str_insert)

و شكرا

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

خبرى 6 سنوات فى فيجوال بيزك 6و ASP

#22

السلام عليكم

كنت كتبت موضوع مسبقاً

عن كيفية حل هذه الثغرة

في جافا

أضعه هنا من باب الشيء بالشيء يذكر

لمحة جافاوية 10:ثغرة الحقن

بالمناسبة الثغرة مشهورة جداً

بل تكاد تكون الأشهر

وجميع لغات البرمجة الحديثة توفر آلية لحلها

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#23

اى حاجه داخله الداتابيز بأمررها الأول قبل ما ادخلها الداتابيز على mysql_real_escape_string

اى حاجه خارجة لصفحة ويب بأمررها الأول قبل ما اخرجها للصفحة على htmlentities

وهى دوال جاهزة متوفرة مع PHP دون اى اكواد اضافية - هل هذا يكفى؟

 

net_code كتب:
أو أخطر من هذا , فإذا كان اليوزر لديه صلاحية , فما المانع من وضع

Expand  -  Plain text

; DROP TABLE users; --

مكان اليوزر نيم

أو أى جملة آخرى ك Insert مثلا

أو إستخدام ال xp_cmdshell فى الSQLServer

ملخص كلامى أنه يجب فلترة المدخلات قبل وضعها فى جمل ال mysql فالحيل كثيرة جدا

هذه الحيل لن تنفذ ولن تفيد - لأن mysql_query ينفذ جملة sql واحدة (unique query بمعنى multiple queries are not supported) فى mysql_query.

والأفضل استخدام mysql_real_escape_string مع المتغيرات قبل حقنها فى جملة sql

<input type="text" value="password" size="20">
") or die ("Error connect database");                mysql_select_db("test", $link) or die ("Error select database");                 $query  = "SELECT * FROM users WHERE name='".$name."' AND password='".$pass."'";                $result = mysql_query($query, $link);                 if (mysql_numrows($result)>0)                {                        $row = mysql_fetch_row($result);                         echo 'Welcome ... '.htmlentities($row[1], ENT_QUOTES).'';                }                mysql_close($link);        }        if (isset($_POST['comment']))                echo 'Your comment: '.htmlentities($_POST['comment'], ENT_QUOTES).'';        echo ''; ?>Username: <input type="text" name="user" value="">Password: <input type="text" name="passwd" value=""><textarea name="comment"></textarea>
< script>alert('Javascript will not work')</script>
$name = mysql_real_escape_string($_POST['user']);
$pass = mysql_real_escape_string($_POST['passwd']);

$qu = "SELECT * FROM users WHERE name='".$name."'" ;

$member = mysql_fetch_array(mysql_query($qu));

if ($member AND $member['password'] == $pass )
{
... etc






وعند اخراج المتغيرات الى صفحة ويب كما ذكر الاخ hgb
 
تستخدم معها htmlentities

هاوضح بمثال
فى mysql اعمل قاعدة بيانات اسمها test
اعمل فيها جدول اسمه users

[table=Table][tr][th]id[/th][th]name[/th][th]password[/th][/tr][tr][td=100]1[/td][td=100]admin[/td][td=100]123456[/td][/tr][tr][td=100]2[/td][td=100]user[/td][td=100]abcd[/td][/tr][/table]
 
حاول ان تعمل هاك للصفحة دى XSS او SQL Injection او Code Injection

الحماية فقط ب mysql_real_escape_string و htmlentities وهى دوال جاهزة متوفرة مع PHP دون اى اكواد اضافية

حاول انت تدخل فى الاسم او كلمة المرور اى sql injection
حاول ان تدخل فى الcomment اى xss ذى
 
 

انا باستخدم الاسليب دى فى حماية صفحاتى - مشكور جدا لو حد اكتشف فيها ثغره ونبهنى ليها

index.rar

تم تعديل هذه المشاركة بواسطة Xacker في 18 يناير 2013 في 03:22

#24

^^^

اخي الا تظن انه يمكن تجاوز الداله Mysql_real_escape_string

عن طريق الامر التالي في خانة اليوزر : or 1=1

الباس : 44444444444444444444

..في امان الله

tvquran_7.gif

Secur1ty-Area

#25

أليس من المفترض أن تقوم بإدخال ' حتى تستطيع أن تقوم بإدخال أمر جديد أخ حازم؟

و mysql_real_escape_string تعالج قيمة '

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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