في برمجة ASP، يمكن القول أن مصادقة الهوية شائعة الاستخدام. ولكن كيف يمكننا تحقيق أمن المصادقة؟
صفحة إرسال النموذج: sub.htm
<أتش تي أم أل>
<الرأس>
<title>تسجيل دخول المسؤول</title>
<الجسم>
<اسم النموذج = "form1" طريقة = "post" action = "sub.asp">
<p>المسؤول:
<نوع الإدخال = "نص" اسم = "معرف المستخدم" حجم = "25" أقصى طول = "20">
كلمة المرور:
<نوع الإدخال = "نص" اسم = "حجم المرور" = "12" أقصى طول = "20">
<نوع الإدخال = "إرسال" الاسم = "إرسال" القيمة = "إرسال">
</ص>
</النموذج>
</الجسم>
</html>
برنامج SUB.asp
<%
تلقي البيانات من النموذج
user=request.from("معرف المستخدم")
تحقق مما إذا كانت البيانات المقدمة بواسطة النموذج فارغة (يمكنك استخدام JAVASCRIPT أو VBSCRIPT للتحكم في صفحة النموذج، لكن لا تنس التحكم بها هنا!)
إذا كان المستخدم = "" ثم
انتقل إلى صفحة رسالة الخطأ!
استجابة.إعادة توجيه "err1.htm"
قد لا تكون هذه الجملة مفيدة، لكن من الجيد إضافتها!
Response.end
نهاية إذا
pass=request.from("Pass")
إذا مرر = "" ثم
استجابة. إعادة توجيه "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 * from table Where user= "&user&" وpass= "&pass&" "
رس.فتح SQL
إن لم يكن rs.eof ثم
إذا وجدت ذلك، انتقل إلى صفحة الإدارة.
استجابة.إعادة توجيه "login.asp"
آخر
إذا لم يتم العثور عليه، سوف تدخل صفحة خطأ.
استجابة.اكتب "err3.htm"
نهاية إذا
%>
يشعر الجميع أن الكود أعلاه يجب أن يكون جيدًا، ولكن هناك خطر أمني كبير هنا:
إذا أردت تسجيل الدخول إلى المسؤول، فيمكنني إدخاله في مربع إدخال النموذج SUb.htm:
أدخل في مربع النص الأول: a أو 1 = 1 أو OR =
الإدخال في مربع النص الثاني: a أو 1 = 1 أو OR =
إرسال، سيرى الجميع... "أوه، استمع لي، حسنًا، سأرمي الطوب لاحقًا..."
"a" و "1" هي أي أحرف.
قد يتساءل البعض عن سبب دخولك كمسؤول عند إدخال هذه الأحرف؟ ؟
في الواقع، هذه الأحرف هي خداع للغة SQL في برنامجك. بالنسبة لأولئك الذين دخلوا بنجاح،
يرجى الاطلاع على: عند بدء تشغيل برنامج SQL، يتم الاستعلام عن الجدول للسجلات التي تلبي المستخدم= "&user&" و pass= ". &pass&" "conditions
sql="select * from table Where user= "&user&" and pass= "&pass&" "
بعد أن أدخلت الكود أعلاه، أصبح:
sql="select * from table Where user= a أو 1 = 1 و pass= a أو 1 = 1 "
دعونا نرى، هل هناك أي سبب لعدم الدخول؟ أعطني سببًا لعدم الدخول!
وينطبق الشيء نفسه إذا كان حقل مرور المستخدم أعلاه رقميًا!
الحل:
1.
استخدم استبدال استبدال الأحرف الخاصة في المحتوى الذي أدخله المستخدم لتحقيق أغراض التحكم! " "
يمكن لهذه الطريقة استبدال حرف واحد فقط في كل مرة. في الواقع، الأحرف الخطيرة ليست فقط " "، ولكن أيضًا أحرف مثل ">" و"<" و"&" و"%" وما إلى ذلك. يجب التحكم فيه بالكامل ولكن ماذا علي أن أفعل إذا كانت وظيفة REPLACE غير مناسبة
2. تستخدم طريقة التحكم في البرنامج
برنامجًا للتحكم في كل المحتوى الذي يدخله العميل، بحيث يمكن لأي أحرف أو رموز خطيرة محتملة يدخلها المستخدم. يمكن السيطرة عليها بالكامل، وهذا هو طريقتي!
<%
التقاط محتوى النموذج المقدم من قبل المستخدم
المستخدم=طلب.من("المستخدم")
تمرير=طلب.من("تمرير")
...
يبدأ التحكم في الحلقة
لأني = 1 إلى لين (المستخدم)
استخدم الدالة MID لقراءة حرف في الموضع i في المستخدم المتغير
لنا = منتصف (المستخدم، ط، 1)
قارن قراءة الأحرف
إذا كنا = "" أو us = "%" أو us = "<" أو us = ">" أو us = "&" إذن
إذا كان يحتوي على الأحرف المذكورة أعلاه، فستظهر رسالة خطأ لا يمكن أن يحتوي على الأحرف الخاصة المذكورة أعلاه.
استجابة. إعادة توجيه "err2.htm"
Response.end
نهاية إذا
التالي
...
%>