في برمجة ASP، يمكن القول أن مصادقة الهوية شائعة الاستخدام. ولكن كيف يمكننا تحقيق أمن المصادقة؟
صفحة إرسال النموذج: sub.htm
<أتش تي أم أل>
<الرأس>
<title>تسجيل دخول المسؤول</title>
<الجسم>
<اسم النموذج=طريقة النموذج1=إجراء النشر=sub.asp>
<p>المسؤول:
<نوع الإدخال=اسم النص=حجم معرف المستخدم=25 الحد الأقصى للطول=20>
كلمة المرور:
<نوع الإدخال=اسم النص=حجم المرور=12 الحد الأقصى للطول=20>
<نوع الإدخال=اسم الإرسال=قيمة الإرسال=إرسال>
</ص>
</النموذج>
</الجسم>
</html>
برنامج SUB.asp
<%
تلقي البيانات من النموذج
المستخدم=request.from(معرف المستخدم)
تحقق مما إذا كانت البيانات المقدمة بواسطة النموذج فارغة (يمكنك استخدام JAVASCRIPT أو VBSCRIPT للتحكم في صفحة النموذج، لكن لا تنس التحكم بها هنا!)
إذا كان المستخدم = إذن
انتقل إلى صفحة رسالة الخطأ!
Response.redirect err1.htm
قد لا تكون هذه الجملة مفيدة، لكن من الجيد إضافتها!
Response.end
نهاية إذا
تمرير=طلب.من(تمرير)
إذا مر = ثم
Response.redirect err2.htm
Response.end
نهاية إذا
الانضمام إلى قاعدة البيانات
file=server.mappath(قاعدة البيانات الخاصة بك)
تعيين conn=server.createobject(adodb.connection)
dr=driver={برنامج تشغيل الوصول إلى Microsoft (*.mdb)};dbq=&file
conn.open الدكتور
تعيين rs=server.createobject(adodb.recordset)
المفتاح هو لغة SQL هنا
sql=select * من الجدول حيث المستخدم= &user& و pass= &pass&
rs.opensql
إن لم يكن rs.eof ثم
إذا وجدت ذلك، انتقل إلى صفحة الإدارة.
استجابة. إعادة توجيه تسجيل الدخول.asp
آخر
إذا لم يتم العثور عليه، سوف تدخل صفحة خطأ.
استجابة.كتابة err3.htm
نهاية إذا
%>
يشعر الجميع أن الكود أعلاه يجب أن يكون جيدًا، ولكن هناك مخاطرة أمنية خطيرة هنا:
إذا كنت أرغب في تسجيل الدخول كمسؤول، فيمكنني الدخول في مربع إدخال النموذج SUb.htm:
أدخل في مربع النص الأول: a أو 1 = 1 أو OR =
أدخل في مربع النص الثاني: a أو 1 = 1 أو OR =
أرسل، سيرى الجميع... أوه، استمع لي، حسنًا، سأرمي الطوب لاحقًا...
a و 1 كلها أحرف
قد يتساءل البعض لماذا تدخل هذه الأحرف للدخول كمسؤول؟ ؟
في الواقع، يتم استخدام هذه الأحرف لخداع لغة SQL في برنامجك والدخول إليها بنجاح.
كما ترون: في برنامج البداية SQL، يتم الاستعلام عن الجدول للسجلات التي تلبي شروط المستخدم= &user& وpass= &pass&.
sql=select * من الجدول حيث المستخدم= &user& و pass= &pass&
وبعد أن أدخلت الكود أعلاه أصبح:
sql=select * من الجدول حيث المستخدم= a أو 1 = 1 والتمرير= a أو 1 = 1
دعونا نلقي نظرة هل هناك أي سبب لعدم الدخول؟ ؟ أعطني سببًا لعدم الدخول أولاً!
حقل تمرير المستخدم أعلاه هو من نوع الحرف وينطبق الشيء نفسه إذا كان من النوع الرقمي!
حل:
1. طريقة استبدال الوظيفة:
استخدم REPLACE لاستبدال الأحرف الخاصة الموجودة في المحتوى الذي يدخله المستخدم لتحقيق أغراض التحكم! sql=select * من الجدول حيث المستخدم= &replace(user, , )& و pass= &replace(pass, , )&
يمكن لهذه الطريقة استبدال حرف واحد فقط في كل مرة. في الواقع، لا ينبغي التحكم في الأحرف الخطيرة فحسب، بل يجب أيضًا التحكم في الأحرف مثل > و< و& و% وما إلى ذلك. ولكن ماذا علي أن أفعل إذا لم أتمكن من استخدام وظيفة الاستبدال؟ ؟
2. طريقة التحكم بالبرنامج
استخدم برنامجًا للتحكم في كل المحتوى الذي يدخله العميل، بحيث يمكن التحكم بالكامل في أي أحرف أو رموز خطيرة محتملة يدخلها المستخدم. هذه هي طريقتي!
<%
التقاط محتوى النموذج المقدم من قبل المستخدم
المستخدم=request.from(المستخدم)
تمرير=طلب.من(تمرير)
...
يبدأ التحكم في الحلقة
لأني = 1 إلى لين (المستخدم)
استخدم الدالة MID لقراءة حرف في الموضع i في المستخدم المتغير
لنا = منتصف (المستخدم، ط، 1)
قارن قراءة الأحرف
إذا نحن= أو لنا=% أو لنا=< أو لنا=> أو لنا=& إذن
إذا كان يحتوي على الأحرف المذكورة أعلاه، فستظهر رسالة خطأ لا يمكن أن يحتوي على الأحرف الخاصة المذكورة أعلاه.
Response.redirect err2.htm
Response.end
نهاية إذا
التالي
...
%>