Rischi silenziosi nella serializzazione JSON del testo di sistema predefinito
La libreria System.Text.Json è diventata la libreria predefinita per la maggior parte delle applicazioni .NET moderne. È efficiente, leggera e profondamente integrata in ASP.NET Core. Tuttavia, le stesse impostazioni predefinite che la rendono semplice introducono anche rischi per la sicurezza latenti. Per impostazione predefinita, la serializzazione System.Text.Json serializza automaticamente tutte le proprietà pubbliche, anche quelle che contengono dati sensibili come token o identificatori interni. Gli sviluppatori spesso si affidano a queste impostazioni predefinite per la velocità, trascurando il fatto che potrebbero esporre informazioni riservate nelle risposte API (jsonserializer).
⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.
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..."} Questo comportamento jsonserializer espone Token di sessione perché tutte le proprietà pubbliche vengono serializzate automaticamente.
Versione sicura:
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 didattica: Usa sempre [JsonIgnore] per proprietà sensibili o progettare DTO separati che contengano solo campi destinati alla serializzazione.
Come JsonSerializer espande l'esposizione senza preavviso
JsonSerializer in System.Text.Json non si ferma al livello superficiale. Esplora ricorsivamente oggetti annidati, raccolte e valori enum, serializzando tutto ciò a cui può accedere. Senza un'esclusione esplicita, ciò può facilmente portare a perdite di dati annidate, soprattutto quando gli oggetti interni contengono token, identificatori o chiavi di sessione.
⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.
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"}} L'oggetto annidato fa sì che la serializzazione del testo JSON del sistema includa il sensibile Token di accesso automaticamente.
Versione sicura:
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 didattica: Definisci sempre Opzioni JsonSerializer in modo esplicito e rivedere i tipi annidati per l'esposizione involontaria dei dati.
Impatto reale su API e microservizi
Nelle applicazioni .NET reali, questi rischi di serializzazione spesso passano inosservati fino alla distribuzione. La combinazione di automazione, riutilizzo di DTO e comportamento predefinito di jsonserializer amplifica l'esposizione. Modelli comuni in cui la serializzazione non sicura causa perdite di dati:
- Riutilizzo delle entità EF Core direttamente nelle risposte API.
Registrazione di oggetti serializzati contenenti dati di autenticazione. - Condivisione di modelli tra servizi interni e pubblici in CI/CD pipelines.
⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.
// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); Se l' colpevole contiene PasswordHash or Token di sessione, questi sono ora memorizzati in CI/CD registri, violando principi del privilegio minimo. Non esporre mai token reali, credenziali o URL interni in pipelines.
Versione sicura:
var options = new JsonSerializerOptions { IgnoreReadOnlyProperties = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); Nota didattica: Sanificare o annullare i campi sensibili prima di effettuare l'accesso e utilizzare sempre metodi sicuri Opzioni JsonSerializer valori predefiniti per l'output di controllo.
Pratiche di serializzazione sicure per gli sviluppatori
Gli sviluppatori dovrebbero considerare le impostazioni predefinite di system.text.json come un livello di praticità, non come una politica di sicurezza. Una serializzazione sicura del testo JSON di sistema significa avere il controllo su ciò che esce dall'applicazione.
Difese pratiche
- Definisci contratti espliciti: Creare DTO dedicati per le risposte API, non serializzare mai direttamente entità EF o di dominio.
- Configurare le opzioni globali: Usa il JsonSerializerOptions.DefaultIgnoreCondition and PropertyNamingPolicy.
- APPLICA [JsonIgnore] o convertitori: Nascondere o trasformare i dati sensibili.
- Convalida gli output: Esaminare le risposte serializzate effettive nei test.
- Automatizzare i controlli: Includere la convalida della serializzazione in CI/CD.
Mini checklist preventiva
- Esaminare tutte le classi utilizzando la serializzazione System.Text.Json
- Contrassegna i segreti o le credenziali con [JsonIgnore]
- Definisci i valori predefiniti di sicurezza globali in Programma.cs or Avvio.cs
- Evitare la serializzazione diretta nei log
- Includi test di esposizione alla serializzazione nel tuo CI/CD pipeline
Nota didattica: La serializzazione sicura mira a limitare l'esposizione, non ad aggiungere complessità. Rendete la serializzazione esplicita e testabile.
Rilevamento della serializzazione non sicura con scansione automatica – System.Text.Json
Scansione automatica in CI/CD Aiuta a rilevare l'uso rischioso di System.Text.Json e JsonSerializer. Gli strumenti di analisi statica possono identificare:
- Modelli mancanti [JsonIgnore].
- Campi sensibili esposti nei DTO.
- Impostazioni predefinite globali non sicure (ad esempio, mancanza di condizioni di ignoranza).
Esempio Pipeline Vedi
# 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 didattica: Integrazione controlli statici nella vostra CI/CD garantisce un controllo coerente sulla serializzazione JSON del testo di sistema in tutte le build.
Come Xygeni Code Security Rafforza la sicurezza della serializzazione .NET
Xygeni Code Security Fornisce un rilevamento approfondito per i valori predefiniti non sicuri di System.Text.Json e l'uso improprio di JsonSerializer in NET.
Identifica modelli quali:
- I campi sensibili vengono serializzati per impostazione predefinita.
- Registrazione non sicura dei dati JSON.
- Mancante [JsonIgnore] attributi.
- Opzioni di serializzazione JSON del testo di sistema non configurate correttamente.
Integrando Xygeni ai miglioramenti pre-commit hooks, CI/CD pipelines, o porte PR, è possibile bloccare i modelli di serializzazione vulnerabili prima che si fondano. Integra il processo DevSecOps esistente trasformando le configurazioni errate di serializzazione in policy di sicurezza applicabili.
Nota didattica: strumenti di sicurezza come Xygeni impongono automaticamente l'igiene della serializzazione, consentendo agli sviluppatori di concentrarsi sul codice e non sugli audit.
Conclusione – Informazioni Sistema.Testo.Json
Sistema.Testo.Json Rende la serializzazione veloce, ma la praticità spesso nasconde l'esposizione. La serializzazione predefinita di system.text.json include ogni proprietà pubblica, con il rischio di perdite di dati interni, token o identificatori.
Gli sviluppatori dovrebbero:
- Verificare i loro modelli.
- Usa il [JsonIgnore] e sicuro Opzioni JsonSerializer.
- Evitare di serializzare oggetti interni.
- Automatizza la scansione utilizzando strumenti come Xygeni Code Security.
La serializzazione predefinita non è solo una scorciatoia per gli sviluppatori; è anche una potenziale perdita di dati. Rendi esplicita la serializzazione, verifica gli output e automatizza i controlli, perché le impostazioni predefinite sicure non sono sempre sicure.






