حماية الخلية من الابرياء SQL حقن
الكاتب:
أشفق الأنصاري

تم التعليق بواسطة:
تصنيف:
5
في أكتوبر 19, 2012
آخر تعديل:يناير 18, 2013

ملخص:

دليل مفصل حول كيفية منع الخلية حقن في PHP. قواعد الترميز آمنة وظائف لمنع حقن SQL.

مقدمة

 

هذا هو دليل موجز حول كيفية حماية الأبرياء الخاص الخلية قاعدة بيانات من حقن SQL الهجمات.
 

ما هو حقن SQL?

 

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

رمز لهذا يمكن أن ننظر بشيء من هذا القبيل:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
// احصل على المستخدم وكلمة المرور من طلب POST
$USER_NAME = $_POST[ 'المستخدم' ];
$كلمة السر  = $_POST[ 'كلمة السر' ];

$سؤال = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table حيث يكون username = '$USER_NAME'وكلمة المرور ='$كلمة السر' ";

$نتيجة = mysql_query( $سؤال );

// تحقق مما إذا وجدت أي شيء الخلية, والحصول على السجل إذا نجحت
إذا ( mysql_num_rows( $نتيجة ) > 0 ) {
    $معطيات = mysql_fetch_assoc( $نتيجة );
    صدى 'مرحبا بكم' . $المستخدم . '!';
    صدى "رقم الحساب الخاص بك هو: ' . $معطيات[ 'ACCOUNT_NUMBER' ] . '';
} //بطباعة رسالة errorr
آخر {
    صدى 'اسم المستخدم أو كلمة المرور غير صالحة! يرجى المحاولة مرة أخرى!';
}
?>

 

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

دعونا نفترض أن أقوم بإدخال “عرض” كما اسمي, و “demopass” كما كلمة السر الخاصة بي, ثم الاستعلام SQL التي يتم تمريرها إلى الخلية سوف يبدو مثل هذا:
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table WHERE اسم المستخدم = 'عرض' AND كلمة السر = 'Demopass' ;

 

إذا تم التحقق من صحة البيانات المدخلة لدينا بنجاح في قاعدة البيانات, ثم سيتم تسجيل ونحن في النظام، ونحن سيقدم مع رقم الحساب إلا فإننا لن تحصل على الوصول إلى النظام، ونحن سوف تعرض مع رسالة خطأ “اسم المستخدم أو كلمة المرور غير صالحة! يرجى المحاولة مرة أخرى!
 

المشكلة عندما يدخل مستخدم ضار الشخصيات الأخرى التي تهدف إلى إنهاء بيان SQL.
 

دعونا نفترض أن المستخدم يحاول تسجيل الدخول باسم المستخدم dem'o وكلمة مرور demopass.
 

الآن, دعونا نرى كيف يبدو عبارة SQL مثل.
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table WHERE اسم المستخدم = 'إن'ال'وكلمة المرور ='demopass' ;

 

عندما الخلية المنفذة للبيان, فإنه سيتم علاج فقط “ال” كما اسم المستخدم وعندما كان يصادف آخر ‘ال', ثم فإنه يعامل ‘ال‘ كما أمر SQL، وسوف رمي خطأ ورسالة لأنها لا تعترف ‘ال‘ كما أمر SQL صالح.
 
خطأ 1064 (42000): لديك خطأ في بناء جملة SQL الخاصة بك; دليل للتحقق من أن يتوافق مع إصدار خادم MySQL الخاص لبناء الجملة الحق في استخدام بالقرب من 'س’ وكلمة المرور =”demopass”; ” في السطر 1
 

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

الآن, دعونا نرى ما سيحدث إذا كان المستخدم يدخل اسم المستخدم والخبيثة (‘ OR "1" = "1) وكلمة مرور “demopass“.

سيقوم الاستعلام SQL تبدو هذه:

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table WHERE اسم المستخدم = '' أو '1 '='1 ' AND كلمة السر = 'Demopass' ;

 

ماذا تعني الاستعلام SQL أعلاه? ويحكي ماي لتجد كافة الصفوف مع اسم المستخدم يساوي “” (فراغ) أو (1= 1) وكلمة مرور يساوي “demopass“.
 

دعونا تمثل الاستعلام SQL أعلاه أكثر منطقيا لفهم ما هو الخطأ في الواقع مع بيان SQL:
 

اسم المستخدم = “” أو “1= 1” وكلمة المرور = “demopass”
 

الآن, نحن نعلم بالفعل أن 1 = 1 هو دائما ما يكون صحيحا. من هنا, وسوف يكون المستخدم قادرا على تسجيل الدخول إلى النظام إذا كان كلمة السر هو الصحيح، واسم المستخدم غير صحيح.
 

دعونا نحلل السيناريو أكثر سوءا مع سلسلة مختلفة هجوم.
 

مهاجمة سلسلة: ‘ OR 1 = 1–
 

يرجى ملاحظة أن ( و #) تستخدم ل إنهاء بيان SQL. دعونا نضع السلسلة هجوم في استعلام SQL ونرى كيف بيان SQL النهائية ستبدو.
 

الآن, فإننا نفترض أن المهاجم لا يعرفون حتى كلمة المرور.
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table WHERE اسم المستخدم = '' أو 1=1--'وكلمة المرور =' idonotknow ' ;

 

انظر كيف يتم تفسير عبارة SQL بواسطة MySQL.
 

اسم المستخدم = “” OR 1 = 1– وكلمة المرور = “idonotknow”
 

يرجى ملاحظة في البيان أعلاه. ونحن نعلم أن هو بيان المنهي في SQL و 1= 1 هو صحيحا دائما, بعد لن يتم تنفيذ العبارة المنهي بقية الاستعلام SQL.
 

من هنا, سوف تحصل على إرجاع كافة السجلات في الجدول وسيتم تسجيل مستخدم في النظام. سوف المهاجم تكون قادرا على رؤية رقم الحساب من السجل الأول في قاعدة البيانات.
 

دعونا نساعد الخلية الأبرياء
 

ونقلت السحر

 

ونقلت السحر هي ميزة مثيرة للجدل للغة البرمجة PHP, حيث يتم الإعدادية العضوية الحروف الخاصة بخط مائل قبل أن تنتقل.
 

ونقلت السحر تم تمكين افتراضيا في المنشآت الجديدة من PHP3 و PHP4, ومنذ تشغيلها هو وراء الكواليس وليس واضحا على الفور, قد يكون للمطورين يجهل وجودها والمشاكل المحتملة التي يمكن أن يعرض.
 

سيكون لدينا لتشغيل ونقلت السحر في لغة PHP الملف في جذر شبكة الإنترنت من الموقع.
 

كيف اقتباسات ماجيك يساعد?

 

نحن بحاجة إلى أن هروب هذه الأحرف اقتباس ( ونقلت كل من مفردة ومزدوجة, وكذلك خطوط مائلة عكسية).
ويتم ذلك عن طريق وضع مائل أمامهم.
 

So usename = dem'o يصبح ماركا 'O , والخلية يمكن العمل بها مع أن علامة الاقتباس كما هو “محمي” من جانب مائل.
 

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

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table WHERE اسم المستخدم = '\' OR 1 = 1 - ' AND كلمة السر = 'idonotknow' ;

 

يتم تفسير اسم المستخدم كما: \’ OR 1 = 1–

وهذا هو تماما نجا الاستعلام SQL, لا شيء يمكن الحصول على حقن. magic_quotes_gpc يهرب الاقتباس واحد خطير بالنسبة لنا. من هنا, سوف المهاجم لن يكون قادرا على تسجيل الدخول إلى النظام.

القضايا مع اقتباسات ماجيك

 

ونقلت السحر إدراج فقط مائل قبل عدد قليل من الشخصيات, لا شيء أكثر. هذا يحمينا من حقن SQL فقط في بعض الحالات الخاصة مثل أعلاه وفقط من خلال المشاركة في الإصابة. إذا كان لدينا display_errors ON, التي قطعناها على أنفسنا فقط المهاجم سعيد جدا مع تفاصيل قاعدة البيانات الخاصة بك أنتج الحق أمام عينيه. حتى لو كنت لا, لا يزال هناك إمكانية أعمى حقن SQL واستخدام أساليب حقن SQL مسبقا أنه من الممكن لتجاوز magic_quotes_gpc وظيفة.
 
هكذا, نحن بحاجة إلى وسيلة للافلات من البيانات التي ليست كربي, ولا تتعرض لقضايا مجموعة أحرف كما, وليس عرضة للسحر تربية يقتبس خفضت.
 
في نوفمبر 2005 قرر مطوري PHP الأساسية على حساب من هذه المشاكل التي ونقلت السحر سيتم إزالة ميزة من PHP 6.
مرة واحدة في ونقلت السحر يتم سحب الميزات, ثم هناك ستكون بعض المشاكل الرئيسية الزرع حتى.
 

SQL حقن التخفيف
 

هناك عدد من الطرق لمنع الخلية الحقن داخل PHP. الطرق الأكثر شيوعا تستخدم وظائف مثل addslashes() و mysql_real_escape_string().
 

addslashes()

 

addslashes() سيعود سلسلة بخط مائل قبل الأحرف التي تحتاج إلى تطهير في استعلامات قاعدة البيانات. هذه الأحرف هي علامات الاقتباس المفردة (‘ = ’) علامات الاقتباس المزدوجة (” = ”) وnullbyte (%00 = \0).
 

addslashes() وسوف تعمل فقط إذا تم ملفوفة سلسلة الاستعلام في الاقتباس. ومن شأن سلسلة مثل ما يلي لا يزال عرضة لحقن SQL:
 

1
2
3
$USER_NAME = addslashes( $_POST[ 'المستخدم' ] );
$كلمة السر  = addslashes( $_POST[ 'كلمة السر' ] );
$سؤال = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table حيث يكون username = '$USER_NAME'وكلمة المرور ='$كلمة السر' ";

mysql_real_escape_string()

 

mysql_real_escape_string() هو قليلا أقوى من addslashes() كما أنه يدعو وظيفة الخلية في مكتبة mysql_real_escape_string, التي prepends خطوط مائلة عكسية إلى الأحرف التالية: \X00, \ن, \R, \, ', ” و X1A.
 

كما هو الحال مع addslashes(), mysql_real_escape_string() وسوف تعمل فقط إذا تم ملفوفة سلسلة الاستعلام في الاقتباس. ومن شأن سلسلة مثل ما يلي لا يزال عرضة لحقن SQL:
 

1
2
3
$USER_NAME = mysql_real_escape_string( $_POST[ 'المستخدم' ] );
$كلمة السر  = mysql_real_escape_string( $_POST[ 'كلمة السر' ] );
$سؤال = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table حيث يكون username = '$USER_NAME'وكلمة المرور ='$كلمة السر' ";

 

sprintf()

 

sprintf() يمكن استخدامها مع المواصفات التحويل للتأكد من أن حجة ديناميكية يتم التعامل مع الطريقة التي نفترض أن يعامل. مثلا, إذا كانت مكالمة لرقم المستخدمين في سلسلة, وسوف تستخدم لضمان يتم التعامل مع حجة كسلسلة. مثال على ذلك هو كما يلي:
 

1
2
3
$USER_NAME = $_POST[ 'المستخدم' ];
$كلمة السر  = $_POST[ 'كلمة السر' ];
$سؤال = sprintf("SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table حيث يكون username = ''وكلمة المرور ='' ", $USER_NAME, $كلمة السر);

 

htmlentities($كان, ENT_QUOTES)

 

htmlentities() بالتزامن مع اختياري المعلمة quote_style الثاني, يسمح باستخدام ENT_QUOTES, التي سيتم تحويل كل من يقتبس مزدوجة ومفردة. وهذا العمل في نفس الشعور كما addslashes() و mysql_real_escape_string() في ما يخص علامات الاقتباس, لكن, بدلا من معلق مسبقا مائل, فإنه سيتم استخدام الكيان HTML من علامة اقتباس.
 

بالإضافة إلى استخدام ENT_QUOTES ضمن htmlentities(), يمكن تعيين معلمة الثالث الأمر الذي يفرض على استخدام مجموعة أحرف ضمن التحويل. وهذا سوف يساعد على وقف النتائج غير المتوقعة من استخدام متعددة وحدات البايت الأحرف في مجموعات الأحرف مثل BIG5 و GPK.
 

ما يلي هو مثال من التعليمات البرمجية التي من شأنها أن تساعد على منع حقن SQL في PHP.
 

1
2
3
4
5
$USER_NAME = $_POST[ 'المستخدم' ];
$USER_NAME = htmlentities( $USER_NAME, ENT_QUOTES, 'UTF-8' );
$كلمة السر  = $_POST[ 'كلمة السر' ];
$كلمة السر  = htmlentities( $كلمة السر, ENT_QUOTES, 'UTF-8' );
$سؤال = "SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER من users_table حيث يكون username = '$USER_NAME'وكلمة المرور ='$كلمة السر' ";

 

تحسين التعليمات البرمجية SQL

 

خوادم قاعدة البيانات وحوش معقدة ولها وظيفة أكثر من ذلك بكثير مما تحتاج. بقدر ما يتعلق بالأمن, أكثر من ذلك هو أبدا أفضل. على سبيل المثال, ال xp_cmdshell الموسعة الإجراء المخزن في MS SQL يتيح الوصول إلى وعاء وهذا هو بالضبط ما تحلم القراصنة من. هذا هو السبب يجب عليك تعطيل هذا الإجراء وأية وظائف أخرى, والتي يمكن بسهولة أن يساء استخدامها. مجرد إزالة أو على الأقل تعطيل أي وظيفة يمكنك القيام به دون.
 

تعطيل الافتراضي SQL رسالة خطأ

 

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

تخزين بيانات اعتماد قاعدة البيانات بشكل آمن

 

من أجل الحد من الضرر في حال وقوع هجوم حقن SQL, دائما تخزين أوراق اعتماد قاعدة البيانات في ملف مشفر منفصلة. الآن حتى لو هاكر تمكن من كسر في, انه أو انها لن تستفيد كثيرا كما انه لا يمكن أن تفعل الكثير في قاعدة البيانات الخاصة بك.
 

استخدام أقل مبدأ الامتياز

 

مبدأ الامتيازات الأقل هو مفيد للغاية وأنها تنطبق على حقن SQL كذلك. دائما التفكير أو مراجعة مرتين حول ما امتيازات كنت تقدم إلى المستخدم أو موضوع. افترض كنت WAN لتوفير وصول مشرف إلى بعض المستخدم, وذلك فقط توفر له إمكانية وصول تلك الجداول التي هو / هي بحاجة, بدلا من إثبات له وصول قاعدة البيانات بأكملها. إذا كان لديك لتوفير الوصول إلى نظام, على نحو أفضل ل خلق المساحات جدول مقسمة داخل قاعدة البيانات وتوفير الوصول فقط إلى الفضاء جدول معين. هذه التقنية سوف خفض كبير في سطح الهجوم.
 

تعطيل الأصداف

 

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

استخدام أدوات حقن SQL للتحقق وجود ثغرات أمنية

 

وأخيرا وليس آخرا, اعتقد مثل هاكر. كيف يمكن للهاكر الإختراق من خلال قاعدة البيانات الخاصة بي حقن SQL, ما هي الأدوات والتقنيات التي يمكن استخدامها للعثور على الثغرات. يجب أن يكون لديك دائما تجف من SQL أدوات الإختراق الحقن مثل SQLi, Haviz, SQL injectme إلخ. أكثر إذا كنت لا تستطيع تحمله شبكية العين الضعف الماسح الضوئي ثم الجيد جدا. لأنها تتكون من جميع أحدث نقاط الضعف يتعرض.

شكرا جزيلا. وآمل أن كل شيء يجب أن تتمتع. يرجى إعطاء تعليقات حتى نتمكن من بذل المزيد من الجهد أفضل.

 
 

28,917 مجموع المشاهدات, 16 مشاهدات اليوم

اللسانين التالية تغيير المحتوى أدناه.

أشفق الأنصاري

باحث الأمن
أشفق الأنصاري هو مؤسس HackSys الفريق اطلق عليها اسم "النمر". فهو باحث الأمن ذوي الخبرة في مختلف جوانب أمن المعلومات. قام بتأليف انه "HackSys المتطرفة سائق الضعفاء" و "Shellcode من الموت". وقد كتب أيضا ونشرت صفحات بيضاء مختلفة على استغلال البرمجيات على مستوى منخفض. اهتمامه الأساسية تكمن في "انخفاض مستوى الاستغلال", "الهندسة العكسية", "تحليل البرنامج" و "الهجين التضبيب". وهو بوي الذكاء الاصطناعي وآلة التعلم. وهو يؤدي الفصل ل اغية بيون.

أحدث المشاركات التي كتبها أشفق الأنصاري (انظر جميع)

ترك الرد

لن يتم نشر عنوان بريدك الإلكتروني. يتم وضع علامة الحقول المطلوبة *