system.text.json - jsonserializer - تسلسل نص النظام بتنسيق json

الإعدادات الافتراضية لـ System.Text.Json في .NET: عندما تفتح الراحة المجال لكشف البيانات

المخاطر الصامتة في تسلسل نص النظام الافتراضي بتنسيق JSON

أصبحت مكتبة System.Text.Json المكتبة الافتراضية لمعظم تطبيقات .NET الحديثة. فهي فعّالة وخفيفة الوزن ومتكاملة بشكل عميق مع ASP.NET Core. لكن الإعدادات الافتراضية نفسها التي تُبسطها تُسبب أيضًا مخاطر أمنية خفية. افتراضيًا، يُسلسل System.Text.Json جميع الخصائص العامة تلقائيًا، حتى تلك التي تحتوي على بيانات حساسة مثل الرموز أو المعرفات الداخلية. غالبًا ما يعتمد المطورون على هذه الإعدادات الافتراضية للسرعة، متجاهلين احتمال كشفها عن معلومات سرية في استجابات واجهة برمجة التطبيقات (jsonserializer). 

⚠️مثال غير آمن، لأغراض تعليمية فقط. لا يُستخدم في الإنتاج.

public class UserProfile {     public string UserName { get; set; }     public string Email { get; set; }     public string SessionToken { get; set; }  // Sensitive field }   var json = JsonSerializer.Serialize(userProfile); Console.WriteLine(json); // Output: {"UserName":"alex","Email":"alex@example.com","SessionToken":"eyJhbGciOi..."} 

يعرض سلوك jsonserializer هذا جلسة توكين لأن جميع الخصائص العامة يتم تسلسلها تلقائيًا.

النسخة الآمنة:

public class UserProfile {     public string UserName { get; set; }     public string Email { get; set; }       [JsonIgnore] // Prevent serialization of sensitive fields     public string SessionToken { get; set; } } 

ملاحظة تعليمية: دائما يستخدم [تجاهل Json] للخصائص الحساسة أو تصميم DTOs منفصلة تحتوي فقط على الحقول المخصصة للتسلسل.

كيف يقوم JsonSerializer بتوسيع نطاق العرض دون سابق إنذار

لا يتوقف مُسلسل JsonSerializer في System.Text.Json عند المستوى السطحي، بل يتنقل بشكل متكرر عبر الكائنات المتداخلة والمجموعات وقيم التعداد، مُسلسلاً كل ما يمكنه الوصول إليه. بدون استبعاد صريح، يمكن أن يؤدي هذا بسهولة إلى تسريبات بيانات متداخلة، خاصةً عندما تحتوي الكائنات الداخلية على رموز أو معرفات أو مفاتيح جلسة.

⚠️مثال غير آمن، لأغراض تعليمية فقط. لا يُستخدم في الإنتاج.

public class AuthData {     public string AccessToken { get; set; } // Sensitive }   public class ApiResponse {     public string Message { get; set; }     public AuthData AuthInfo { get; set; }  // Nested object }   var json = JsonSerializer.Serialize(new ApiResponse {     Message = "OK",     AuthInfo = new AuthData { AccessToken = "abc123" } }); Console.WriteLine(json); // Output: {"Message":"OK","AuthInfo":{"AccessToken":"abc123"}} 

يجعل الكائن المتداخل تسلسل نص النظام json يتضمن البيانات الحساسة رمز الوصول تلقائيا.

النسخة الآمنة:

public class AuthData {     [JsonIgnore] // Prevent exposure of sensitive tokens     public string AccessToken { get; set; } }   public class ApiResponse {     public string Message { get; set; }     public AuthData AuthInfo { get; set; } }   var options = new JsonSerializerOptions {     DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,     WriteIndented = false };   var json = JsonSerializer.Serialize(apiResponse, options); 

ملاحظة تعليمية: حدد دائما خيارات JsonSerializer قم بمراجعة الأنواع المتداخلة بشكل صريح بحثًا عن التعرض غير المقصود للبيانات.

التأثير الواقعي في واجهات برمجة التطبيقات والخدمات المصغرة

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

  • إعادة استخدام كيانات EF Core مباشرةً في استجابات API.
    تسجيل الكائنات التسلسلية التي تحتوي على بيانات المصادقة.
  • مشاركة النماذج بين الخدمات الداخلية والعامة في CI/CD pipelines.

⚠️مثال غير آمن، لأغراض تعليمية فقط. لا يُستخدم في الإنتاج.

// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); 

إذا كان نتيجة يحتوي كلمة مرور هاش or جلسة توكين، يتم تخزينها الآن في CI/CD السجلات، المخالفة مبادئ الحد الأدنى من الامتيازات. لا تعرض أبدًا الرموز الحقيقية أو بيانات الاعتماد أو عناوين URL الداخلية في pipelines.

النسخة الآمنة:

var options = new JsonSerializerOptions {     IgnoreReadOnlyProperties = true,     DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); 

ملاحظة تعليمية: قم بتطهير الحقول الحساسة أو إبطالها قبل تسجيل الدخول، واستخدم دائمًا طرقًا آمنة خيارات JsonSerializer الإعدادات الافتراضية لمخرجات التدقيق.

ممارسات التسلسل الآمن للمطورين

ينبغي على المطورين التعامل مع إعدادات system.text.json الافتراضية كطبقة تسهيل، وليست سياسة أمان. تسلسل JSON الآمن لنصوص النظام يعني التحكم في ما يخرج من تطبيقك.

الدفاعات العملية

  1. تعريف العقود الصريحة: قم بإنشاء DTOs مخصصة لاستجابات API، ولا تقم أبدًا بتسلسل كيانات EF أو المجال بشكل مباشر.
  2. تكوين الخيارات العالمية: استعمل خيارات JsonSerializer. تجاهل الشرط الافتراضي و سياسة تسمية الممتلكات.
  3. تطبيق [تجاهل Json] أو المحولات: إخفاء أو تحويل البيانات الحساسة.
  4. التحقق من صحة المخرجات: فحص الاستجابات التسلسلية الفعلية في الاختبارات.
  5. أتمتة عمليات التحقق: تضمين التحقق من التسلسل في CI/CD.

قائمة مرجعية وقائية صغيرة

  • مراجعة جميع الفئات باستخدام تسلسل System.Text.Json
  • وضع علامة على الأسرار أو بيانات الاعتماد باستخدام [تجاهل Json]
  • تحديد الإعدادات الافتراضية الآمنة العالمية في Program.cs or Startup.cs
  • تجنب التسلسل المباشر في السجلات
  • قم بتضمين اختبارات التعرض التسلسلي في CI/CD pipeline

ملاحظة تعليمية: التسلسل الآمن يعني الحد من التعرض، لا زيادة التعقيد. اجعل التسلسل واضحًا وقابلًا للاختبار.

الكشف عن التسلسل غير الآمن باستخدام المسح التلقائي – System.Text.Json

المسح الآلي في CI/CD يساعد في الكشف عن الاستخدام غير الآمن لملفي System.Text.Json وJsonSerializer. تستطيع أدوات التحليل الثابت تحديد:

  • نماذج مفقودة [تجاهل Json].
  • الحقول الحساسة مكشوفة في DTOs.
  • الإعدادات الافتراضية العالمية غير الآمنة (على سبيل المثال، عدم وجود شروط التجاهل).

مثال Pipeline تحقق

# Never expose real tokens, credentials, or internal URLs in pipelines - name: Run serialization security checks   run: dotnet xygeni validate --rules serialization --fail-on-risk 

ملاحظة تعليمية: دمج فحوصات ثابتة الدخول الى حسابك CI/CD يضمن التحكم المتسق في تسلسل نص النظام JSON عبر جميع الإصدارات.

 

كيفية Xygeni Code Security يعزز أمان تسلسل .NET

زيجيني Code Security يوفر اكتشافًا عميقًا للإعدادات الافتراضية غير الآمنة لـ System.Text.Json والاستخدام الخاطئ لـ JsonSerializer في NET.

ويحدد الأنماط مثل:

  • يتم تسلسل الحقول الحساسة بشكل افتراضي.
  • التسجيل غير الآمن لبيانات JSON.
  • مفقود [تجاهل Json] الصفات.
  • خيارات التسلسل JSON لنصوص النظام غير صحيحة.

من خلال دمج زيجيني إلى pre-commit hooks, CI/CD pipelineباستخدام بوابات العلاقات العامة أو s، يمكنك حظر أنماط التسلسل المعرضة للخطر قبل دمجها. إنه يكمل عملية DevSecOps الحالية لديك عن طريق تحويل تكوينات التسلسل الخاطئة إلى سياسات أمان قابلة للتنفيذ.

ملاحظة تعليمية: أدوات الأمان مثل Xygeni تعمل على تطبيق نظافة التسلسل تلقائيًا، إتاحة الفرصة للمطورين للتركيز على الكود، وليس التدقيق.

الخاتمة – حول نظام.نص.Json

نظام.نص.Json يجعل التسلسل سريعًا، لكن سهولة الاستخدام غالبًا ما تُخفي الكشف. يتضمن التسلسل الافتراضي لملف system.text.json جميع الخصائص العامة، مما قد يُسرّب بيانات داخلية أو رموزًا أو مُعرّفات.

ينبغي للمطورين:

  • تدقيق نماذجهم.
  • استعمل [تجاهل Json] و أمن خيارات JsonSerializer.
  • تجنب تسلسل الكائنات الداخلية.
  • أتمتة المسح باستخدام أدوات مثل Xygeni Code Security.

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

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

قم بتأمين تطوير البرامج الخاصة بك وتسليمها

مع مجموعة منتجات Xygeni