إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
| المنتج /الخدمة | مقالة |
|---|---|
| WCF | |
| واجهة برمجة تطبيقات الويب | |
| تطبيق ويب |
WCF - لا تضمن عقدة serviceDebug في ملف التكوين
| عنوان | التفاصيل |
|---|---|
| Component | WCF |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | عام، NET Framework 3 |
| سمات | غير متوفر |
| المراجع | MSDN، Fortify Kingdom |
| الخطوات | يمكن تكوين خدمات إطار عمل الاتصال في Windows (WCF) لكشف معلومات التصحيح. يجب ألا تستخدم معلومات التصحيح في بيئات الإنتاج. يحدد الوسم <serviceDebug> ما إذا كانت ميزة معلومات التصحيح مفعلة لخدمة WCF. إذا تم تعيين السمة includeExceptionDetailInFaults على true، سيتم إرجاع معلومات الاستثناءات من التطبيق إلى العميل. يمكن للمهاجمين الاستفادة من المعلومات الإضافية التي يحصلون عليها من تصحيح الأخطاء لتنفيذ هجمات تستهدف الإطار أو قاعدة البيانات أو الموارد الأخرى المستخدمة من قبل التطبيق. |
مثال
يتضمن ملف التكوين التالي العلامة <serviceDebug> :
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=""MyServiceBehavior"">
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/>
...
قم بتعطيل معلومات التصحيح في الخدمة. يمكن تحقيق ذلك عن طريق إزالة العلامة <serviceDebug> من ملف إعدادات تطبيقك.
WCF - لا تضمن عقدة serviceMetadata في ملف التكوين
| عنوان | التفاصيل |
|---|---|
| Component | WCF |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | العام |
| سمات | عام، NET Framework 3 |
| المراجع | MSDN، Fortify Kingdom |
| الخطوات | كشف المعلومات عن الخدمة بشكل علني يمكن أن يوفر للمهاجمين رؤى قيمة حول كيفية استغلال الخدمة. يتيح الوسم <serviceMetadata> ميزة نشر البيانات الوصفية. قد تحتوي بيانات الخدمة الوصفية على معلومات حساسة لا ينبغي أن تكون متاحة للجمهور. على الأقل، اسمح للمستخدمين الموثوقين فقط بالوصول إلى البيانات الوصفية وضمان عدم كشف المعلومات غير الضرورية. والأفضل من ذلك، قم بتعطيل القدرة تماما على نشر البيانات الوصفية. تكوين WCF الآمن لن يحتوي على العلامة <serviceMetadata> . |
تأكد من أن التعامل الصحيح مع الاستثناءات يتم في ASP.NET Web API
| عنوان | التفاصيل |
|---|---|
| Component | واجهة برمجة تطبيقات الويب |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | MVC 5، MVC 6 |
| سمات | غير متوفر |
| المراجع | معالجة الاستثناءات في ASP.NET Web API، التحقق من النموذج في ASP.NET Web API |
| الخطوات | افتراضيا، تترجم معظم الاستثناءات غير المكتشفة في ASP.NET Web API إلى استجابة HTTP برمز الحالة 500, Internal Server Error |
مثال
للتحكم في رمز الحالة الذي يعيده الواجهة، HttpResponseException يمكن استخدامه كما هو موضح أدناه:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
مثال
لمزيد من التحكم في استجابة الاستثناء، يمكن استخدام الفئة HttpResponseMessage كما هو موضح أدناه:
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(string.Format("No product with ID = {0}", id)),
ReasonPhrase = "Product ID Not Found"
}
throw new HttpResponseException(resp);
}
return item;
}
لاكتشاف الاستثناءات غير المتعاملة التي ليست من النوع HttpResponseException، يمكن استخدام مرشحات الاستثناء. تقوم مرشحات الاستثناء بتنفيذ الواجهة System.Web.Http.Filters.IExceptionFilter . أبسط طريقة لكتابة مرشح استثناء هي الاشتقاق من الفئة System.Web.Http.Filters.ExceptionFilterAttribute وتجاوز طريقة OnException.
مثال
إليك مرشح يحول NotImplementedException الاستثناءات إلى رمز 501, Not Implementedحالة HTTP:
namespace ProductStore.Filters
{
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
}
}
}
هناك عدة طرق لتسجيل مرشح استثناءات واجهة برمجة تطبيقات الويب:
- بالفعل
- حسب وحدة التحكم
- عالميا
مثال
لتطبيق المرشح على إجراء معين، أضف المرشح كخاصية إلى الإجراء:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
مثال
لتطبيق المرشح على جميع الإجراءات على ، controllerأضف المرشح كسمة إلى الفئة controller :
[NotImplExceptionFilter]
public class ProductsController : ApiController
{
// ...
}
مثال
لتطبيق الفلتر بشكل عام على جميع وحدات تحكم واجهة برمجة تطبيقات الويب، أضف نسخة من الفلتر إلى المجموعة GlobalConfiguration.Configuration.Filters . تنطبق مرشحات الاستثناء في هذه المجموعة على أي إجراء لوحدة تحكم واجهة برمجة تطبيقات الويب.
GlobalConfiguration.Configuration.Filters.Add(
new ProductStore.NotImplExceptionFilterAttribute());
مثال
للتحقق من صحة النموذج، يمكن تمرير حالة النموذج إلى طريقة CreateErrorResponse كما هو موضح أدناه:
public HttpResponseMessage PostProduct(Product item)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
// Implementation not shown...
}
تحقق من الروابط في قسم المراجع لمزيد من التفاصيل حول التعامل الاستثنائي والتحقق من صحة النماذج في ASP.NET Web API
لا تكشف تفاصيل الأمان في رسائل الخطأ
| عنوان | التفاصيل |
|---|---|
| Component | تطبيق ويب |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | العام |
| سمات | غير متوفر |
| المراجع | غير متوفر |
| الخطوات | يتم توفير رسائل خطأ عامة مباشرة للمستخدم دون تضمين بيانات التطبيقات الحساسة. أمثلة على البيانات الحساسة تشمل:
سيساعد حبس جميع الأخطاء داخل التطبيق وتوفير رسائل أخطاء عامة، بالإضافة إلى تمكين أخطاء مخصصة داخل IIS، في منع الكشف عن المعلومات. إدارة قواعد بيانات SQL Server واستثناءات .NET، إلى جانب بنى معالجة الأخطاء الأخرى، مطولة بشكل خاص ومفيدة للغاية للمستخدمين الخبيثين الذين يصنفون تطبيقك. لا تعرض محتويات الفئة المشتقة من فئة استثناءات .NET مباشرة، وتأكد من أن لديك معالجة استثنائية بشكل صحيح حتى لا يتم عرض استثناء غير متوقع مباشرة للمستخدم عن غير قصد.
|
تنفيذ صفحة معالجة الأخطاء الافتراضية
| عنوان | التفاصيل |
|---|---|
| Component | تطبيق ويب |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | العام |
| سمات | غير متوفر |
| المراجع | تحرير مربع حوار إعدادات صفحات الخطأ ASP.NET |
| الخطوات | عندما يفشل تطبيق ASP.NET ويتسبب في خطأ في خادم HTTP/1.x 500 داخلي، أو عندما يمنع تكوين الميزة (مثل تصفية الطلبات) عرض الصفحة، يتم توليد رسالة خطأ. يمكن للمسؤولين اختيار ما إذا كان يجب على التطبيق عرض رسالة ودية للعميل، أو رسالة خطأ مفصلة للعميل، أو رسالة خطأ مفصلة للمضيف المحلي فقط.
افتح ملف |
تعيين طريقة النشر في البيع بالتجزئة في IIS
| عنوان | التفاصيل |
|---|---|
| Component | تطبيق ويب |
| مرحلة SDL | التوزيع |
| التقنيات المعمول بها | العام |
| سمات | غير متوفر |
| المراجع | deployment element (ASP.NET Set Schema) |
| الخطوات |
غالبا ما يتم تفعيل المفاتيح والخيارات التي تركز على المطورين، مثل فشل تتبع الطلبات وتصحيح الأخطاء، أثناء التطوير النشط. يوصى بأن يتم ضبط طريقة النشر على أي خادم إنتاجي على النسخة السوقية. افتح ملف machine.config وتأكد من بقائها |
يجب أن تفشل الاستثناءات بأمان
| عنوان | التفاصيل |
|---|---|
| Component | تطبيق ويب |
| مرحلة SDL | بناء |
| التقنيات المعمول بها | العام |
| سمات | غير متوفر |
| المراجع | فشل بأمان |
| الخطوات | يجب أن يفشل التطبيق بأمان. أي طريقة ترجع قيمة بوليانية، بناء على اتخاذ قرار معين، يجب أن يكون لديها كتلة استثناء منشأة بعناية. هناك الكثير من الأخطاء المنطقية التي تتسلل بسببها مشاكل الأمان عندما تكتب كتلة الاستثناء بشكل غير دقيق. |
مثال
public static bool ValidateDomain(string pathToValidate, Uri currentUrl)
{
try
{
if (!string.IsNullOrWhiteSpace(pathToValidate))
{
var domain = RetrieveDomain(currentUrl);
var replyPath = new Uri(pathToValidate);
var replyDomain = RetrieveDomain(replyPath);
if (string.Compare(domain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
{
//// Adding additional check to enable CMS urls if they are not hosted on same domain.
if (!string.IsNullOrWhiteSpace(Utilities.CmsBase))
{
var cmsDomain = RetrieveDomain(new Uri(Utilities.Base.Trim()));
if (string.Compare(cmDomain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
{
return false;
}
else
{
return true;
}
}
return false;
}
}
return true;
}
catch (UriFormatException ex)
{
LogHelper.LogException("Utilities:ValidateDomain", ex);
return true;
}
}
الطريقة أعلاه ستعيد دائما True، إذا حدث استثناء ما. إذا قدم المستخدم النهائي عنوان URL مشوه، يحترمه المتصفح بينما لا يحترمه الصانع Uri() ، فهذا سيعطي استثناء، وسيتم نقل الضحية إلى الرابط الصحيح ولكن المشوه.