المصدر: MSDN
الترجمة: نطاق تطبيق Yunzhongcheng BLOG
:
أسب.نت الإصدار 1.1
أسب.نت الإصدار 2.0
ملخص:
يقدم هذا النص بشكل أساسي كيفية التحقق من إدخال المستخدم لمنع هجمات الحقن. من الضروري جدًا التحقق من إدخال المستخدم. تحتوي جميع الهجمات على مستوى البرنامج تقريبًا على طرق إدخال ضارة.
يجب عليك التحقق من تضمين الحقول ومعلمات سلسلة الاستعلام وملفات تعريف الارتباط والمستخدمين الآخرين يتم استخدام عناصر الإدخال لحماية برنامجك من هجمات الحقن. عليك أن تفترض أن جميع مدخلات المستخدم ضارة وتأكد من التحقق من جميع مدخلات المستخدم على جانب الخادم. يمكن أن يؤدي استخدام التحقق من الصحة على أساس العميل إلى تقليل عدد الإقامات في الصفحة. تحسين الأداء، وتحسين تجربة المستخدم، ولكن لا تعتمد على ذلك فقط، لأنه يمكن بسهولة خداع التحقق من جانب العميل من قبل المتسللين
من أجل التحقق من صحة محتوى الإدخال، يجب عليك تحديد قواعد الإدخال المقبولة لكل حقل إدخال هو إنشاء قيود بناءً على طول حقل الإدخال ونطاقه وتنسيقه ونوعه. استخدم قائمة قيود أحرف مقبولة بدلاً من قائمة أحرف غير قانونية لتقييد الإدخال. إن استخدام قيود قائمة الأحرف غير القانونية ليس جيدًا لأنه يكاد يكون مستحيلًا لتصفية كافة المدخلات الضارة
إذا كنت بحاجة إلى قبول إدخال أحرف HTML، فمن الأفضل استخدام طريقة مثل HtmlEncode لتشفيرها بأمان قبل عرضها.
المحتوى:
نظرة عامة
على الغرض
، تغذية التنفيذ خطوة بخطوة،
الخطوة 1. استخدام ASP. التحقق من طلب NET.
الخطوة 2. استخدم إدخال قيد الحقوق.
الخطوة 3.قم
بتشفير الإدخال غير الآمن.
الخطوة
5. تحقق من عدم إرجاع أخطاء ASP.NET إلى العميل
-------------------------------------------------- ------------------------------
غاية:
تقييد طول سلسلة الإدخال ونطاقها وتنسيقها ونوعها.
استخدم التحقق من صحة الطلب لمنع هجمات الحقن عند تطوير برامج ASP.NET.
استخدم عناصر التحكم في التحقق من صحة ASP.NET للتحقق من صحة الإدخال.
تشفير الإخراج غير الآمن.
منع هجمات الحقن باستخدام نمط مجموعة معلمات الأمر.
منع إرجاع تفاصيل الخطأ إلى العميل.
نظرة عامة:
يجب عليك التحقق من صحة جميع المدخلات غير الموثوق بها في التطبيق الخاص بك، ويجب أن تفترض أن جميع مدخلات المستخدم غير صالحة. عناوين IP، وما إلى ذلك.
عادةً ما يوفر التحقق الضعيف من صحة الإدخال فرصًا لهجمات الحقن. وفيما يلي طرق شائعة للهجوم باستخدام التحقق الضعيف من صحة الإدخال أو عدم التحقق من صحة الإدخال.
حقن SQL إذا كنت تستخدم قيم إدخال المستخدم لإنشاء عبارات SQL ديناميكيًا، فقد تقوم قاعدة البيانات بتنفيذ عبارات SQL مسيئة وضارة.
تستغل هجمات البرمجة النصية عبر المواقع الثغرات الأمنية في التحقق من صحة صفحات الويب لإدخال البرامج النصية من جانب العميل، ثم يتم إرسال هذه الرموز إلى جهاز الكمبيوتر العميل الموثوق به ويتم تفسيرها وتنفيذها بواسطة المتصفح لا يوجد لدى المتصفح طريقة لمعرفة أن الكود ضار.
الوصول غير المصرح به إلى الملفات إذا كان الرمز الخاص بك يقبل الإدخال من المتصل، فيمكن لمستخدم ضار رؤية عمليات الملف والوصول إلى الملفات المحمية أو استخدام التعليمات البرمجية الخاصة بك لإدخال بيانات غير قانونية.
ملاحظة: يمكن تنفيذ هجمات الحقن باستخدام اتصالات HTTP أو HTTPS Secure Connector Layer (SSL). لا يمكن استخدام تقنيات تشفير النقل لمنع الهجمات.
يتم تلخيص طرق التحقق من صحة الإدخال أدناه. يجب إجراء التحقق من الصحة في كل مكان يكون فيه الإدخال مطلوبًا عبر الشبكة ، مثل مربعات النص وحقول إدخال النماذج الأخرى ومعلمات سلسلة الاستعلام وملفات تعريف الارتباط والمتغيرات من جانب الخادم ومعلمات طريقة الشبكة. لاحظ أن استراتيجية التصفية يجب أن تسمح فقط بالإدخال الصحيح وترفض الإدخال غير القانوني. وذلك لأن تحديد استراتيجية الإدخال الصحيحة أفضل من تصفية الكل، من الأسهل اكتشاف المدخلات غير القانونية، ولكن عادةً ما يكون من الصعب تضمين جميع المدخلات غير القانونية.
التحقق من محتوى الإدخال من خلال الجوانب التالية:
القيود: تأكد من أن الإدخال من النوع الصحيح وطول الأحرف والتنسيق والنطاق الذي يمكن تطبيقه لتقييد إدخال التحكم في الخادم. ويمكن استخدام قواعد التحقق المخصصة لتقييد الإدخال من مصادر أخرى.
رفض الكشف عن إدخال البيانات الضارة المعروفة ورفضها.
التصفية في بعض الأحيان قد ترغب في تصفية أجزاء إدخال المستخدم التي تشكل مخاطر أمنية، على سبيل المثال، إذا كان تطبيقك يسمح بإدخال حر، مثل حقول المذكرة، فسوف تسمح ببعض علامات HTML الآمنة مثل <b> و<i. > وعلامات HTML الأخرى.
ملخص الخطوة
قم بحماية تطبيق ASP.NET الخاص بك من هجمات الحقن باتباع الخطوات التالية:
الخطوة 1. استخدم التحقق من طلب ASP.NET.
الخطوة 2. تقييد الإدخال.
الخطوة 3. تشفير الإخراج غير الآمن.
الخطوة 4. استخدم معلمات الأوامر لعبارات استعلام SQL.
الخطوة 5. تأكد من عدم تسرب معلومات خطأ ASP.NET إلى العميل.
ستناقش الفصول التالية هذه الخطوات بالتفصيل.
الخطوة 1. استخدم التحقق من صحة طلب ASP.NET
بشكل افتراضي، يتحقق التحقق من صحة طلب ASP.NET 1.1 و2.0 مما إذا كانت البيانات المرسلة إلى الخادم تحتوي على عناصر ترميز HTML وأحرف محجوزة من إدخال البرامج النصية في البرنامج. ستتم مطابقة التحقق من صحة الطلب مع قائمة السلاسل التي قد تشكل تهديدًا، وإذا تم العثور على استثناء، فسيتم طرح استثناء من النوع HttpRequestValidationException.
يمكنك القيام بذلك في ملف web.config الخاص بك عن طريق < Add validateRequest= "خطأ" إلى عنصر الصفحات> أو قم بتعيين ValidateRequest = "false" في عنصر @Pages لصفحة منفصلة لتعطيل هذه الميزة.
إذا كنت تريد تعطيل التحقق من صحة الطلب، فيمكنك تعطيله فقط على الصفحات التي تحتاج إليها. على سبيل المثال، إذا قمت بتضمين حقل في صفحة البرنامج يقبل الإدخال بتنسيق HTML،
فتأكد من تشغيل ميزة التحقق من صحة الطلب في ملف Machine.config
. ويتم تمكين ميزة التحقق من صحة الطلب بشكل افتراضي في ASP.NET يمكنك القيام بذلك في ملف Machine.config.comments. ستشاهد الإعدادات الافتراضية التالية
<pages validateRequest = "true"... />
تأكد من عدم تعديل الإعدادات الافتراضية في Machine.config الخاص بالخادم وموقع الويب الخاص بالتطبيق. ملفات التكوين.
اختبار التحقق من صحة طلب ASP.NET
يمكنك اختبار تأثير التحقق من صحة الطلب. قم بإنشاء صفحة ASP.NET وتعطيل التحقق من صحة الطلب عن طريق تعيين ValidateRequest = "fasle" كما يلي:
<%@ Language="C#" ValidateRequest="false" %>
<أتش تي أم أل>
<script runat="server">
باطلة btnSubmit_Click(مرسل الكائن، EventArgs e)
{
// إذا كانت قيمة ValidateRequest خاطئة، فسيتم عرض "مرحبًا".
// إذا كانت قيمة ValidateRequest صحيحة، فسيُرجع ASP.NET استثناءً
Response.Write(txtString.Text);
}
</script>
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
<asp:TextBox معرف = "txtString" رونات = "الخادم"
Text="<script>alert('hello');</script>" />
<asp:Button id = "btnSubmit" runat = "الخادم" OnClick = "btnSubmit_Click"
النص = "إرسال" />
</النموذج>
</الجسم>
</html>
عند تشغيل الصفحة، يتم عرض "Hello" في مربع رسالة لأنه يتم تنفيذ البرنامج النصي الموجود في txtString ومعالجته بواسطة مستعرض العميل.
إذا قمت بتعيين ValidateRequest = "true" أو إزالة سمة صفحة ValidateRequest، فإن ASP .NET يطلب التحقق من الصحة. سيرفض إدخال البرنامج النصي وسيظهر رسالة خطأ مثل تلك الموجودة أدناه.
تم اكتشاف قيمة Request.Form قد تكون خطرة من العميل (txtString="<script>alert('hello").
احرص على عدم الاعتماد فقط على وظيفة التحقق من الطلب، ولكن استخدمها فقط كطريقة إرشادية للتحقق المخصص.
الخطوة 2. تقييد الإدخال
لتقييد الإدخال، استخدم الطريقة التالية:
استخدم التحقق من صحة الإدخال من جانب الخادم لا تعتمد على التحقق من جانب العميل، حيث يمكن تجاوزه بسهولة. استخدم التحقق من جانب العميل لتقليل عدد ارتدادات الصفحة وتحسين الأداء وتحسين تجربة المستخدم.
التحقق من صحة طول الإدخال ونطاقه وتنسيقه ونوعه وتأكد من صحة محتوى الإدخال واستيفاءه للمتطلبات.
استخدم أنواع البيانات القوية حدد نوعًا مثل عدد صحيح أو مزدوج للإدخال الرقمي. حدد نوع بيانات السلسلة لإدخال الأحرف. حدد نوع التاريخ والوقت لإدخال التاريخ والوقت.
للتحقق من صحة حقول إدخال تحكم HTML في نموذج، قم بإجراء التحقق من الصحة في التعليمات البرمجية من جانب الخادم. يمكن أن يساعد استخدام نوع التعبير العادي Regex في تقييد إدخال الأحرف. يصف القسم التالي كيفية تقييد متغيرات أنواع الإدخال
الشائعة
للتحقق من صحة حقول السلسلة مثل الاسم والعنوان والفاكس ورقم شهادة الميلاد، استخدم التعبيرات العادية.
يقيد النطاق المقبول من الأحرف.
تمكين قواعد التنسيق، على سبيل المثال، تتطلب الحقول المستندة إلى النمط مثل المعرف الضريبي والرمز البريدي والرمز البريدي أنماط أحرف محددة.
التحقق من الطول.
استخدم عنصر التحكم في التحقق من صحة التعبير العادي (RegularExpresionValidator)
لاستخدام عنصر التحكم في التحقق من صحة التعبير العادي، تحتاج إلى تعيين اسم عنصر التحكم المراد التحقق منه (ControlToValidate)، وتعبير التحقق من الصحة (ValidationExpression)، ورسالة الخطأ (ErrorMessage) للتعرف على إعدادات الخاصية ذات الصلة المثال أدناه.
<form id="WebForm"method="post" runat="server">
<asp:TextBox id="txtName" runat="server"></asp:TextBox>
<asp:معرف RegularExpressionValidator = "nameRegex" runat = "الخادم"
كونترولتوفاليديت = "txtName"
ValidationExpression="^[a-zA-Z'.s]{1,40}$"
رسالة الخطأ = "اسم غير صالح">
</asp:regularexpressionvalidator>
</النموذج>
في الكود أعلاه، يتم استخدام تعبير عادي لتقييد اسم الإدخال بالأحرف (يُسمح بالأحرف الكبيرة والصغيرة)، والمسافات، وعلامات الحذف ذات الاسم الفردي مثل O'Dell والنقاط، بالإضافة إلى ذلك، يقتصر طول حرف الإدخال على 40 حرفًا الأحرف
لاحظ أن عنصر التحكم في التحقق من صحة التعبير العادي (RegularExpressionValidator) سيضيف تلقائيًا علامة الإقحام (^) وعلامة الدولار ($) كمحددات البداية والنهاية إذا لم تقم بإضافتها في التعبير المخصص، فمن الأفضل إضافتها إن إضافة المحددات هو فقط للسماح لتعبيرك بالحصول على جزء من البيانات التي تريدها،
استخدم فئة التعبير العادي (Regex Class)
إذا كنت لا تستخدم عناصر التحكم من جانب الخادم (بمعنى أنه لا يمكنك استخدام عناصر التحكم في التحقق من الصحة)، أو إذا كنت بحاجة إلى عناصر تحكم أخرى. مصادر حقول الإدخال بخلاف حقول النموذج (مثل معلمات سلسلة الاستعلام وملفات تعريف الارتباط)، يمكنك استخدام فئة التعبير العادي (فئة Regex)
استخدم فئة التعبير العادي
لاستيراد مساحة الاسم System.Text.RegularExpressions عن طريق إضافة عبارة باستخدام. بادئة.
تأكد من أن التعبير العادي يحتوي على "^" و"$" (في بداية السلسلة، في نهاية السلسلة).
قم باستدعاء أسلوب IsMatch لفئة Regex، وفيما يلي مثال للتعليمات البرمجية.
// طريقة المثيل:
Regex reg = new Regex(@"^[a-zA-Z'.s]{1,40}$");
Response.Write(reg.IsMatch(txtName.Text));
// الطريقة الثابتة:
إذا (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z'.s]{1,40}$"))
{
// الاسم لا يطابق التعبير
}
إذا لم تتمكن من تخزين التعبيرات العادية المستخدمة بشكل متكرر، فيجب عليك استخدام الطريقة الثابتة IsMatch لتحسين الأداء ومنع إنشاء كائن غير ضروري.
في معظم الحالات، يجب عليك التحقق من صحة الإدخال والنطاقاتالرقمية
. استخدم عناصر تحكم الخادم للتحقق من الإدخال والنطاق الحقول الرقمية، استخدم عنصر التحكم RangeValidator الذي يدعم بيانات العملة والتاريخ والعدد الصحيح والدقة المزدوجة ونوع السلسلة.
لاستخدام عنصر التحكم RangeValidator، تحتاج إلى تعيين اسم عنصر التحكم (ControlToValidate)، والنوع (النوع)، والحد الأدنى للقيمة (MinimumValue). )، وخصائص القيمة القصوى (MaximumValue)، ورسالة الخطأ (ErrorMessage). هنا هو مثال التعليمات البرمجية:
<asp:RangeValidator
معرف = "رانجفاليداتور1"
رونات = "الخادم"
ErrorMessage="نطاق غير صالح. يجب أن يتراوح الرقم بين 0 و255."
كونترولتوفاليديت = "نطاق الإدخال"
القيمة القصوى = "255"
الحد الأدنى للقيمة = "0" النوع = "عدد صحيح" />
إذا كنت لا تستخدم عنصر تحكم الخادم، فيمكنك إكمال التحقق من نطاق الأرقام عن طريق تحويل قيمة الإدخال إلى عدد صحيح ثم التحقق من صحتها. على سبيل المثال، للتحقق مما إذا كان العدد الصحيح قانونيًا، استخدم الأسلوب الجديد Int32.TryParse المقدم من ASP.NET 2.0 لتحويل قيمة الإدخال إلى نوع متغير System.Int32. سترجع هذه الطريقة خطأ في حالة فشل التحويل.
Int32 ط؛
إذا (Int32.TryParse(txtInput.Text, out i) == false)
{
// فشل التحويل
}
إذا كنت تستخدم إصدارًا سابقًا من ASP.NET، فيمكنك استخدام أسلوب Int32.Parse أو Convert.ToInt32 في كتلة محاولة/التقاط ومعالجة FormatException الذي يتم طرحه عند فشل التحويل
يوضح نموذج التعليمات البرمجية التالي كيفية التحقق من الصحة من HTML نوع ونطاق النوع الصحيح لمربع النص.
<%@ لغة الصفحة = "C#" %>
<script runat = "server">
باطلة Page_Load(object sender, EventArgs e)
{
إذا (Request.RequestType == "POST")
{
كثافة العمليات أنا؛
إذا (Int32.TryParse(Request.Form["integerTxt"]، خارج i) == صحيح)
{
// يُرجع TryParse صحيحًا إذا نجح التحويل
إذا ((0 <= i && i <= 255) == صحيح)
{
Response.Write("بيانات الإدخال صالحة.");
}
آخر
Response.Write("بيانات الإدخال خارج النطاق");
}
آخر
Response.Write("بيانات الإدخال ليست عددًا صحيحًا");
}
}
</script>
<html>
<الجسم>
<form id = "form1" action = "NumericInput.aspx" أسلوب = "post">
<ديف>
أدخل عددًا صحيحًا بين 0 و255:
<اسم الإدخال = "integerTxt" نوع = "نص" />
<اسم الإدخال = "إرسال" نوع = "إرسال" القيمة = "إرسال" />
</div>
</النموذج>
</الجسم>
</html>
التحقق من صحة حقول التاريخ
تحتاج إلى التحقق من أن حقول التاريخ من النوع الصحيح. في معظم الحالات، ستحتاج أيضًا إلى التحقق من نطاقها، مثل التحقق مما إذا كانت في المستقبل أو في الماضي إذا كنت تستخدم عنصر تحكم الخادم لالتقاط قيمة إدخال التاريخ، وإذا كنت تريد أن تكون القيمة ضمن نطاق معين، فيمكنك استخدام عنصر التحكم في التحقق من صحة النطاق (RangeValidator) وتعيين النوع المسموح به على نوع التاريخ، ويتيح لك عنصر التحكم هذا تحديد فترة زمنية خاصة عن طريق تعيين لحظة البداية إذا كنت بحاجة إلى استخدام وقت اليوم كمرجع للتحقق، مثل التحقق مما إذا كان الوقت في المستقبل أو في الماضي، فيمكنك استخدام عنصر تحكم التحقق من صحة CustomValidator.
يتطلب استخدام عنصر التحكم CustomValidator للتحقق من صحة التاريخ تعيين خصائص ControlToValidate وErrorMessage، وتحديد أسلوب منطق التحقق من الصحة المخصص في حدث OnServerValidate. وفيما يلي نموذج التعليمات البرمجية.
<%@ لغة الصفحة = "C#" %>
<script runat = "server">
void ValidateDateInFuture(مصدر الكائن، ServerValidateEventArgs args)
{
DateTime dt;
// التحقق من التاريخ الصحيح وأن التاريخ في المستقبل
إذا ((DateTime.TryParse(args.Value, out dt) == false) ||
(dt <= DateTime.Today))
{
args.IsValid = false;
}
}
</script>
<html>
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
<ديف>
<asp:معرف التسمية = "Label1" Runat = "الخادم"
Text="التاريخ المستقبلي:"></asp:Label>
<asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>
<asp:CustomValidator
المعرف = "CustomValidator1" Runat = "الخادم"
ErrorMessage="تاريخ غير صالح. أدخل تاريخًا في المستقبل."
كونترولتوفاليديت = "فيوتشر داتيتكست"
OnServerValidate="ValidateDateInFuture">
</asp:CustomValidator>
<br />
<asp:معرف الزر = "submitBtn" Runat = "الخادم" Text = "إرسال" />
</div>
</النموذج>
</الجسم>
</html>
لاحظ أن التعليمة البرمجية أعلاه تستخدم طريقة DateTime.TryParse وهي طريقة جديدة يوفرها ASP.NET 2.0
لتصفية حقول النص الحرة
لتصفية الإدخال، تحتاج إلى التأكد من عدم معاملة الإدخال غير الآمن كتعليمات برمجية على سبيل المثال
يسمح
للمستخدم بقراءة البيانات الموجودة في قاعدة البيانات المشتركة. تحتاج أولاً إلى تصفية البيانات بحيث لا تكون خطرة عند الإخراج. استخدم أسلوب HttpUtility.HtmlEncode لتشفير قيمة الإدخال أولاً
أضف الحقول التالية إلى عنصر صفحة @Page ValidateRequest = "false" لتعطيل التحقق من صحة طلب ASP.NET. استخدم أسلوب HtmlEncode لترميز سلسلة الإدخال. استخدم كائن StringBuilder واستدعاء أسلوب الاستبدال الخاص به لاستبدال HTML في الأحرف. يقدم التعليمة البرمجية التالية هنا مثالاً على هذا الأسلوب. تعمل هذه الصفحة على تعطيل التحقق من صحة طلب ASP.NET عن طريق تعيين ValidateRequest = "fasle". يسمح ترميز HTML الخاص بها باستخدام علامتي <b> و<i> لعرض تنسيق نص بسيط .
<%@ لغة الصفحة = "C#" ValidateRequest = "false"%>
<script runat = "server">
void SubmitBtn_Click(object sender, EventArgs e)
{
// تشفير إدخال السلسلة
StringBuilder sb = StringBuilder الجديد (
HttpUtility.HtmlEncode(htmlInputTxt.Text));
// السماح بشكل انتقائي و<i>
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
}
</script>
<html>
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
<ديف>
<asp:معرف TextBox = "htmlInputTxt" Runat = "الخادم"
وضع النص = "متعدد الخطوط" العرض = "318 بكسل"
الارتفاع = "168 بكسل"></asp:TextBox>
<asp:معرف الزر = "submitBtn" Runat = "الخادم"
Text="إرسال" OnClick="submitBtn_Click" />
</div>
</النموذج>
</الجسم>
</html>
التحقق من صحة قيمة سلسلة الاستعلام
التحقق من صحة طول سلسلة الاستعلام ونطاقها وتنسيقها ونوعها عادةً، يمكنك استخدام تعبير عادي مدمج لإنجاز المهام التالية:
تقييد قيم الإدخال تعيين عمليات فحص النطاق الصريح تحديد نوع الإدخال وتحويله إلى ASP.NET. النظام الأساسي النوع التالي، يعالج أي استثناءات ناتجة عن تحويلات النوع يوضح مثال التعليمات البرمجية التالي استخدام فئة Regex للتحقق من صحة سلسلة الاسم التي تم تمريرها في سلسلة الاستعلام.
باطلة Page_Load (مرسل الكائن، EventArgs e)
{
إذا (!System.Text.RegularExpressions.Regex.IsMatch(
Request.QueryString["Name"], @"^[a-zA-Z'.s]{1,40}$"))
Response.Write("معلمة اسم غير صالحة");
آخر
Response.Write("الاسم هو " + Request.QueryString["الاسم"]);
}
التحقق من صحة قيم ملفات تعريف الارتباط
يمكن
بسهولة تعديل القيم المخزنة في ملفات تعريف الارتباط مثل سلاسل الاستعلاممن
قبل المستخدم
الأسماء أو عنوان الملف أو مسار تخزين الملف، فأنت بحاجة إلى التحقق من أنها بالتنسيق الصحيح وأنها تشير إلى موقع صالح وفقًا للوضع الفعلي لبرنامجك. إذا فشل هذا التحقق، فقد يُطلب من برنامجك الوصول عن طريق الخطأ
تحقق من مسار الملف
لمنع
استغلال المستخدمين لبرنامجك للوصول إلى الملفات، فامنعه من قبول الملفات أو مسارات الملفات التي تم إدخالها بواسطة التعليمات البرمجية المكتوبة من قبل المستخدم، على سبيل المثال:
إذا قبلت أسماء ملفات الإدخال، فاستخدم الملف System.Data طريقة .IO.Path.GetFileName للحصول على الاسم الكامل للملف. إذا كان يجب عليك قبول مسار ملف الإدخال واستخدام System.IO.Path.GetFullPath للحصول على مسار الملف الكامل، استخدم طريقة MapPath لمنع التعيين عبر التطبيقات .
إذا كنت تستخدم أسلوب MapPath لتعيين دليل ظاهري متوفر إلى دليل فعلي على الخادم، فاستخدم إصدارًا محمّلاً بشكل زائد من أسلوب Request.MapPath مع معلمة منطقية لمنع التعيين عبر التطبيقات، وإليك نموذج التعليمات البرمجية لهذه التقنية:
يحاول
{
سلسلة MappedPath = Request.MapPath( inputPath.Text,
Request.ApplicationPath، false)؛
}
قبض على (HttpException)
{
// تمت محاولة التعيين عبر التطبيقات
}
ستمنع المعلمة الخاطئة النهائية التعيين عبر التطبيقات، وهذا يعني أنه غير مسموح للمستخدمين باستخدام بناء الجملة "..." لتوفير مسار غير قانوني غير موجود ضمن الدليل الظاهري الذي حددته.
إذا كنت تستخدم عناصر تحكم الخادم، فيمكنك استخدام أسلوب Control.MapPathSecure للحصول على عنوان الدليل الفعلي المطابق للدليل الظاهري.
يقوم الأسلوب Control.MapPathSecure بطرح HttpException عند الوصول إلى ملف غير مصرح به. لمزيد من المعلومات، راجع مقدمة أسلوب Control.MapPathSecure في وثائق .NET Framework.
استخدام أمان الوصول إلى التعليمات البرمجية للحد من إدخال الملفات وإخراجها
يمكن للمسؤولين الحد من قدرة البرنامج على قراءة الملفات وكتابتها إلى الدليل الظاهري حيث يوجد عن طريق ضبط مصداقيته على "متوسطة". تضمن آلية أمان كود .NET أن البرنامج ليس لديه أي حقوق وصول إلى الملفات خارج الدليل الظاهري الذي يوجد به.
لتعيين مستوى الثقة لأحد التطبيقات إلى "متوسط"، يمكنك إضافة:
< مستوى الثقة = "متوسط" />
التحقق من عنوان URL
يمكنك استخدام التعبيرات العادية مثل ما يلي لمطابقة عناوين URL
^(?:http|https|ftp)://[a-zA-Z0-9 .-]+(?::d). {1,5})?(?:[A-Za-z0-9.;:@&=+$,? /]|%u[0-9A-Fa- f]{4}|%[0-9A-Fa-f]{2})*$
هذا يقيد تنسيق الإدخال فقط ولا يتحقق مما إذا كان مقبولاً في التطبيق ضمن نطاق التطبيق الخاص بك، ويجب عليك التحقق من ذلك إنه صالح في سياق التطبيق الخاص بك، على سبيل المثال، هل يتصل تطبيقك بالخادم الذي تحدده؟
الخطوة 3. تشفير التعليمات البرمجية غير الآمنة
إذا قمت بإدخال نص في صفحة ويب، استخدم طريقة HttpUtility.HtmlEncode لتشفيره. إذا كان النص يأتي من إدخال المستخدم، أو قاعدة بيانات، أو ملف محلي، فتأكد من القيام بذلك دائمًا.
وبالمثل، إذا كتبت عنوان URL يحتوي على أحرف غير آمنة لأنها تأتي من محتوى إدخال المستخدم، وقواعد البيانات، وما إلى ذلك، فاستخدم الخيار. طريقة HttpUtility.UrlEncode للتشفير.
من أجل منع التشفير قبل تخزين البيانات، مما قد يؤدي إلى تلف البيانات المخزنة، يرجى التأكد من تشفيرها في خطوات لاحقة قدر الإمكان عند عرضها.
استخدم HtmlEncode لترميز الإخراج غير الآمن،
يستبدل HtmlEncode علامات HTML بسلاسل نصية خاصة لتمثيل هذه الرموز ومنع المتصفح من تفسيرها على أنها علامات HTML، على سبيل المثال، يتم استبدال "<" بـ < (النقطتان) مع " يتم عرض هذه العلامات كنص غير ضار.
<%@ لغة الصفحة = "C#" ValidateRequest = "false" %>
<script runat = "server">
إرسال باطل Btn_Click (مرسل الكائن، EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>
<html xmlns=" http://www.w3.org/1999/xhtml " >
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
<ديف>
<asp:معرف TextBox = "inputTxt" Runat = "الخادم"
TextMode = "MultiLine" العرض = "382px" الارتفاع = "152px">
</asp:TextBox>
<asp:معرف الزر = "submitBtn" Runat = "الخادم" النص = "إرسال"
OnClick="submitBtn_Click" />
</div>
</النموذج>
</الجسم>
</html>
لرؤية تأثير ترميز HTML، يرجى إنشاء دليل افتراضي ووضع الملفات المذكورة أعلاه فيه، وتشغيل هذه الصفحة، وإدخال بعض تعليمات HTML البرمجية في مربع النص، ثم النقر فوق زر الإرسال. على سبيل المثال، يتم عرض الإدخال التالي كالمعتاد text.
قم بتشغيل البرنامج النصي وقل مرحبًا <script>alert('hello');</script>
إذا قمت بإزالة استدعاء طريقة HtmlEncode وقمت ببساطة بإدخال محتوى النص، فسيقوم المتصفح بتنفيذ التعليمات البرمجية وينبثق مربع مطالبة.
استخدام أسلوب UrlEncode ليس آمنًا، تشفير عنوان URL
إذا كنت بحاجة إلى الحصول على معلمات URL باستخدام جزء إدخال المستخدم، مما قد يؤدي إلى مخاطر أمنية معينة، استخدم أسلوب HttpUtility.UrlEncode لترميز سلسلة العنوان
HttpUtility.UrlEncode(urlString)
. الخطوة4.
يستخدم بيان SQL طريقة معلمة الأمر،
يرجى استخدام طريقة معلمة SQL للكشف عن النوع والكشف عن الطول قيمة نصية، ولن يتم تنفيذ التعليمات البرمجية الموجودة فيها. هناك فائدة إضافية لاستخدام طريقة تعيين المعلمات وهي أنه يمكنك تحديد نوع الإدخال وطوله بشكل صارم سيتم تشغيل الاستثناء.
عند استدعاء إجراء مخزن، استخدم مجموعة المعلمات
أدناه. يوضح مقتطف التعليمات البرمجية مثالاً لاستخدام مجموعات المعلمات عند استدعاء إجراء مخزن.
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin"،
myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@LoginId"، SqlDbType.VarChar، 11)؛
parm.Value = Login.Text;
استخدم مجموعات المعلمات عند إنشاء عبارات SQL الخاصة بك.
إذا لم تتمكن من استخدام الإجراءات المخزنة، فلا يزال بإمكانك استخدام مجموعات المعلمات، راجع الكود أدناه.
SqlDataAdapter myCommand = جديد SqlDataAdapter(
"اختر au_lname، au_fname من المؤلفين حيث au_id = @au_id"، myConnection);
SQLParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id" ,SqlDbType.VarChar, 11);
Parm.Value = Login.Text;
لمزيد من المعلومات حول كيفية منع هجمات حقن SQL، راجع كيفية: الحماية من حقن SQL في
الخطوة 5 من ASP.NET. للتحقق من عدم إرجاع رسائل خطأ ASP.NET إلى العميل،
يمكنك استخدام العنصر <customErrors>. لتكوين العميل، يجب إرجاع رسائل الخطأ العامة إلى العميل من خلال آلية اكتشاف أخطاء البرنامج.
يرجى التأكد من أنك قمت بتغيير سمة الوضع في web.config إلى "remoteOnly"، وفيما يلي مثال على
ذلك "remoteOnly">
بعد تثبيت برنامج ASP.NET، يمكنك تحديد صفحة رسالة الخطأ الخاصة بالعميل على النحو التالي.
<customErrors mode = "on" defaultRedirect = "YourErrorPage.htm">
للحصول على موارد إضافية، الرجاء عرض المواضيع ذات الصلة:
كيفية استخدام التعبيرات العادية لتقييد الإدخال في ASP.NET،
منع هجمات حقن SQL
ومنع هجمات البرمجة النصية عبر المواقع.
ملحوظة: لقد انتهيت من قراءتها أخيرًا، لقد استغرق الأمر مني ما يقرب من ثلاثة أيام. هذه هي المرة الأولى التي أقوم فيها بالترجمة، أرجو أن تسامحوني إذا كانت الترجمة ليست جيدة، وشكرا لكم.