using Newtonsoft.Json.Serialization;
namespace SecureDeserializationDemo
public object DangerousProperty { get; set; }
public object OtherProp { get; set; }
public class MaliciousClass
Console.WriteLine("Malicious code executed!");
public class HarmlessClass
public object Message { get; set; }
Console.WriteLine("Harmless class instantiated");
public class HarmlessClass2
public string Message { get; set; }
Console.WriteLine("Harmless2 class instantiated");
public class CustomSerializationBinder : DefaultSerializationBinder
public override Type BindToType(string assemblyName, string typeName)
if (typeName == typeof(HarmlessClass).FullName)
return typeof(HarmlessClass);
if (typeName == typeof(HarmlessClass2).FullName)
return typeof(HarmlessClass2);
throw new JsonSerializationException($"Attempted to deserialize unauthorized type: {typeName}");
static void Main(string[] args)
Assembly currentAssembly = Assembly.GetExecutingAssembly();
string assemblyName = currentAssembly.GetName().Name;
string typeName = typeof(HarmlessClass2).FullName;
'$type': '{typeName}, {assemblyName}'
'$type': '{typeName}, {assemblyName}'
Console.WriteLine("JSON payload:");
var settings = new JsonSerializerSettings
TypeNameHandling = TypeNameHandling.All,
SerializationBinder = new CustomSerializationBinder()
var safeClass = JsonConvert.DeserializeObject<HarmlessClass>(json, settings);
Console.WriteLine("Deserialization succeeded.");
Console.WriteLine($"{safeClass.Message}");
catch (JsonSerializationException ex)
Console.WriteLine($"Deserialization failed: {ex.Message}");