Newtonsoft.Json ile serileştirilen tipleri obfuscate ederken JSON adlarını sabitleyin
Obfuscator'lar üye ve tip adlarını değiştirdiğinde Json.NET bu CLR adlarını JSON anahtarı ve $type ayırıcısı olarak yazar, bu da hata vermeden veri sözleşmesini bozar. Yazar, [JsonProperty], [EnumMember] ve sabit bir ISerializationBinder ile wire adlarını nasıl sabitleyeceğinizi ve korunmuş build üzerinde nasıl test edeceğinizi anlatıyor.
Kilit noktalar
- Serileştirilen her üyeye açık bir [JsonProperty] adı verin; adı olmayan bir özellik, yeniden adlandırılabilir CLR adına geri döner.
- Değiştirilemez DTO'larda [JsonConstructor] parametre adlarının obfuscator tarafından değiştirilmediğini doğrulayın.
- StringEnumConverter kullanırken her enum üyesine [EnumMember(Value = ...)] ekleyin.
- Polimorfik payload'larda TypeNameHandling'in varsayılan $type değerlerine güvenmeyin; kararlı adlar için özel bir ISerializationBinder yazın.
- Serileştirme round-trip testini debug build yerine obfuscate edilmiş assembly üzerinde CI'da çalıştırın.
Obfuscation, Newtonsoft.Json serileştirmesini sessizce bozabilir. Json.NET derleme zamanında çalışan bir kaynak üreticisine sahip değildir; tipleri çalışma anında yansıma ile okur ve JSON anahtarı olarak CLR üye adını kullanır. Renamer bu adı değiştirdiğinde wire formatı da değişir; saklanan ya da paylaşılan JSON çalışma anında hata verir ve hiçbir derleme adımı bunu fark etmez.
Yazının önerdiği çözümler: serileştirilen her üyeye açık [JsonProperty] adı vermek, değiştirilemez DTO'lar için parametre adları korunan bir [JsonConstructor] kullanmak ve string enum'lar için [EnumMember] değerleri tanımlamak. En büyük risk TypeNameHandling'dir; $type değeri assembly nitelikli tip adını taşır. Kararlı mantıksal adları tiplere eşleyen özel bir ISerializationBinder bu sorunu çözer; CI'da korunmuş build üzerinde yapılan round-trip testi de gerilemeleri yakalar.
Gerçek dünyada kullanımı
- Sunucu JSON yanıtlarını ayrı bir frontend'in tükettiği bir web API'si; sunucu build'ini obfuscate etmek anahtarları değiştirmemeli.
- Ödeme veya mesaj gibi polimorfik belgeleri saklayan ve bir sonraki sürümden sonra bunları geri okuyan bir servis.
- Üreticiler ve tüketiciler ayrı ayrı derlenip obfuscate edilen kuyruk tabanlı bir mesajlaşma sistemi.
Neden önemli
Json.NET kullanan obfuscate edilmiş bir projede serileştirilen her ad açıkça sabitlenmezse, saklanan ve paylaşılan veriler derleme hatası vermeden bozulur.
Benzer haberler
- Visual Studio Ekim güncellemesi: commit'leri çalışma alanıyla karşılaştırma ve toplu conflict çözümüVisual Studio Blog6 gün önce
- C# 14 extension member'ları: derleyicinin uyarmadığı gölgeleme hatasıDEV Community: #csharp1 gün önce
- C#'ta LLM token'ları: yapay zekâ "strawberry"deki r'leri neden sayamıyor?DEV Community: #csharp1 gün önce