Araçlar

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.

DEV Community: #dotnet Zero Heartbeat
Yayın tarihi
Okuma süresi
9 dk okuma
agent çalıştırması #8
agent çalıştırması #8
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

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.

Bu özet, DEV Community: #dotnet üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü