Deserialisasi adalah pintu masuk data dari dunia luar, dan data dari dunia luar tidak dapat dipercaya begitu saja. Payload yang diformat salah, bertipe tidak sesuai, atau dibuat untuk menembus konverter tertentu dapat memicu exception yang tidak tertangani hingga konsumsi memori berlebih. Bagian ini merangkum risiko utama dan cara sistem meresponsnya secara nyata, dengan dua bukti yang dijalankan langsung pada .NET 9.
Risiko yang Perlu Diantisipasi #
- Tipe tidak sesuai: nilai string diberikan padahal kontraknya angka; serializer melempar
JsonException. - Payload berlebihan: file raksasa atau nesting ratusan tingkat menghabiskan memori; batasi ukuran dan kedalaman sebelum diproses.
- Pembuatan tipe arbitrer: serializer lama yang membaca metadata tipe dari payload memungkinkan object berbahaya dibuat; karena itu deserialisasi polymorphic memakai allowlist
[JsonDerivedType].
Bukti dari Runtime #
csharp
try
{
JsonSerializer.Deserialize<int>("\"bukan angka\"");
}
catch (JsonException e)
{
Console.WriteLine($"JsonException: {e.Message}");
}
try
{
var formatter = new BinaryFormatter();
using var stream = new MemoryStream();
formatter.Serialize(stream, "data");
}
catch (NotSupportedException e)
{
Console.WriteLine($"{e.GetType().Name}: {e.Message}");
}Output yang Dihasilkan:
text
JsonException: The JSON value could not be converted to System.Int32. Path: $ | LineNumber: 0 | BytePositionInLine: 13.
PlatformNotSupportedException: BinaryFormatter serialization and deserialization have been removed. See https://aka.ms/binaryformatter for more information.Mari kita bedah kedua hasil:
- JsonException: pesan mencantumkan tipe target,
Path, posisi baris dan byte; informasi itu membantu menunjuk titik data yang salah tanpa membongkar seluruh payload. - PlatformNotSupportedException:
BinaryFormatter, serializer lama yang menyimpan metadata tipe di payload, telah dihapus dari .NET 9; runtime menolaknya meski kode masih dikompilasi.