Riesgos silenciosos en la serialización JSON de texto del sistema predeterminado
La biblioteca System.Text.Json se ha convertido en la opción predeterminada para la mayoría de las aplicaciones .NET modernas. Es eficiente, ligera y está profundamente integrada en ASP.NET Core. Sin embargo, las mismas características predeterminadas que la hacen simple también introducen riesgos de seguridad silenciosos. Por defecto, la serialización de System.Text.Json serializa automáticamente todas las propiedades públicas, incluso aquellas que contienen datos confidenciales como tokens o identificadores internos. Los desarrolladores suelen confiar en estos valores predeterminados para obtener mayor velocidad, sin tener en cuenta que podrían exponer información confidencial en las respuestas de la API (jsonserializer).
⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.
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..."}
Este comportamiento de jsonserializer expone Token de sesión porque todas las propiedades públicas se serializan automáticamente.
Versión segura:
public class UserProfile
{
public string UserName { get; set; }
public string Email { get; set; }
[JsonIgnore] // Prevent serialization of sensitive fields
public string SessionToken { get; set; }
}
Nota educativa: Siempre usa [JsonIgnore] para propiedades sensibles o diseñar DTO separados que solo contengan campos destinados a la serialización.
Cómo JsonSerializer amplía la exposición sin previo aviso
El JsonSerializer de System.Text.Json no se detiene en el nivel superficial. Recorre recursivamente los objetos anidados, las colecciones y los valores de enumeración, serializando todo aquello a lo que puede acceder. Sin una exclusión explícita, esto puede conducir fácilmente a fugas de datos anidadas, especialmente cuando los objetos internos contienen tokens, identificadores o claves de sesión.
⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.
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"}}
El objeto anidado hace que la serialización JSON del texto del sistema incluya información confidencial. Token de acceso automáticamente.
Versión segura:
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);
Nota educativa: Siempre define Opciones del serializador Json Explicitativamente y revise los tipos anidados para detectar la exposición no intencionada de datos.
Impacto en el mundo real en API y microservicios
En aplicaciones .NET reales, estos riesgos de serialización suelen pasar desapercibidos hasta después de la implementación. La combinación de automatización, reutilización de DTO y el comportamiento predeterminado de jsonserializer aumenta la exposición a estos riesgos. Patrones comunes en los que la serialización insegura provoca fugas de datos:
- Reutilización de entidades de EF Core directamente en respuestas de API.
Registro de objetos serializados que contienen datos de autenticación. - Compartir modelos entre servicios internos y públicos en CI/CD pipelines.
⚠️Ejemplo inseguro, solo con fines educativos. No utilizar en producción.
// Logs the full object, including sensitive fields
_logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result));
Si resultado contiene Hash de contraseña or Token de sesión, ahora se almacenan en CI/CD registros, violando principios de mínimo privilegio. Nunca exponga tokens reales, credenciales ni URL internas en pipelines.
Versión segura:
var options = new JsonSerializerOptions
{
IgnoreReadOnlyProperties = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
// Sanitize before serialization
result.SessionToken = null;
_logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options));
Nota educativa: Elimine o anule los campos confidenciales antes de iniciar sesión y utilice siempre métodos seguros. Opciones del serializador Json Valores predeterminados para la salida de auditoría.
Prácticas seguras de serialización para desarrolladores
Los desarrolladores deben considerar los valores predeterminados de system.text.json como una capa de conveniencia, no como una política de seguridad. La serialización segura de system.text.json en formato JSON implica controlar qué datos salen de la aplicación.
Defensas prácticas
- Definir contratos explícitos: Crea DTOs dedicados para las respuestas de la API, nunca serialices EF ni entidades de dominio directamente.
- Configurar opciones globales: Usa JsonSerializerOptions.DefaultIgnoreCondition y Política de nomenclatura de propiedades.
- Aplicar [JsonIgnore] o convertidores: Ocultar o transformar datos confidenciales.
- Validar resultados: Inspeccione las respuestas serializadas reales en las pruebas.
- Automatizar comprobaciones: Incluir validación de serialización en CI/CD.
Mini lista de verificación preventiva
- Revisar todas las clases utilizando la serialización de System.Text.Json
- Marcar Secretos o credenciales con [JsonIgnore]
- Defina los valores predeterminados seguros globales en Program.cs or Inicio.cs
- Evite la serialización directa en los registros.
- Incluya pruebas de exposición a la serialización en su CI/CD pipeline
Nota educativa: La serialización segura consiste en limitar la exposición, no en añadir complejidad. Haga que la serialización sea explícita y comprobable.
Detección de serialización insegura mediante escaneo automatizado: System.Text.Json
Escaneo automatizado en CI/CD Ayuda a detectar el uso riesgoso de System.Text.Json y JsonSerializer. Las herramientas de análisis estático pueden identificar:
- Modelos faltantes [JsonIgnore].
- Campos sensibles expuestos en DTO.
- Valores predeterminados globales inseguros (por ejemplo, falta de condiciones para ignorar).
Ejemplo Pipeline Comprobar
# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Run serialization security checks
run: dotnet xygeni validate --rules serialization --fail-on-risk
Nota educativa: La integración de comprobaciones estáticas en su CI/CD Garantiza un control consistente sobre la serialización JSON del texto del sistema en todas las compilaciones.
Cómo Xygeni Code Security Refuerza la seguridad de serialización de .NET
xygeni Code Security Proporciona una detección exhaustiva de valores predeterminados inseguros de System.Text.Json y del mal uso de JsonSerializer en .NET.
Identifica patrones tales como:
- Los campos confidenciales se serializan por defecto.
- Registro inseguro de datos JSON.
- Desaparecido [JsonIgnore] los atributos.
- Opciones de serialización JSON del sistema mal configuradas.
Gracias a la integración de la tecnología de xygeni cobren pre-commit hooks, CI/CD pipelines, o puertas PR, puede bloquear patrones de serialización vulnerables antes de que se combinen. Complementa su proceso DevSecOps existente al convertir las configuraciones erróneas de serialización en políticas de seguridad aplicables.
Nota educativa: Las herramientas de seguridad como Xygeni imponen automáticamente medidas de higiene en la serialización. Liberar a los desarrolladores para que se centren en el código, no en las auditorías.
Conclusión – Acerca de System.Text.Json
System.Text.Json Si bien agiliza la serialización, la comodidad suele ocultar vulnerabilidades. La serialización predeterminada de system.text.json incluye todas las propiedades públicas, lo que puede revelar datos internos, tokens o identificadores.
Los desarrolladores deberían:
- Audite sus modelos.
- Usa [JsonIgnore] y seguro Opciones del serializador Json.
- Evite serializar objetos internos.
- Automatice el escaneo utilizando herramientas como Xygeni Code Security.
La serialización por defecto no es solo un atajo para desarrolladores; es una posible fuga de datos. Es fundamental hacer explícita la serialización, verificar las salidas y automatizar las comprobaciones, ya que los valores por defecto seguros no siempre lo son.





