Ciche zagrożenia w serializacji tekstu JSON w systemie domyślnym
Biblioteka System.Text.Json stała się domyślną biblioteką dla większości nowoczesnych aplikacji .NET. Jest wydajna, lekka i głęboko zintegrowana z ASP.NET Core. Jednak te same domyślne ustawienia, które ją upraszczają, wprowadzają ukryte zagrożenia bezpieczeństwa. Domyślnie serializacja System.Text.Json automatycznie serializuje wszystkie właściwości publiczne, nawet te zawierające poufne dane, takie jak tokeny czy identyfikatory wewnętrzne. Programiści często polegają na tych domyślnych ustawieniach, aby zwiększyć szybkość, ignorując fakt, że mogą one ujawnić poufne informacje w odpowiedziach API (jsonserializer).
⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.
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..."}
To zachowanie jsonserializera ujawnia Token sesji ponieważ wszystkie właściwości publiczne są automatycznie serializowane.
Wersja bezpieczna:
public class UserProfile
{
public string UserName { get; set; }
public string Email { get; set; }
[JsonIgnore] // Prevent serialization of sensitive fields
public string SessionToken { get; set; }
}
Uwaga edukacyjna: Zawsze używaj [JsonIgnore] w przypadku wrażliwych właściwości lub zaprojektuj osobne DTO zawierające wyłącznie pola przeznaczone do serializacji.
Jak JsonSerializer rozszerza ekspozycję bez ostrzeżenia
JsonSerializer w System.Text.Json nie zatrzymuje się na poziomie powierzchni. Rekurencyjnie przechodzi przez zagnieżdżone obiekty, kolekcje i wartości wyliczeniowe, serializując wszystko, do czego ma dostęp. Bez wyraźnego wykluczenia może to łatwo doprowadzić do zagnieżdżonych wycieków danych, szczególnie gdy obiekty wewnętrzne zawierają tokeny, identyfikatory lub klucze sesji.
⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.
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"}}
Zagnieżdżony obiekt powoduje, że serializacja tekstu systemowego JSON obejmuje wrażliwe dane AccessToken automatycznie.
Wersja bezpieczna:
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);
Uwaga edukacyjna: Zawsze definiuj Opcje serializatora Json jawnie i sprawdź zagnieżdżone typy pod kątem niezamierzonego ujawnienia danych.
Wpływ na rzeczywisty świat interfejsów API i mikrousług
W rzeczywistych aplikacjach .NET te zagrożenia związane z serializacją często pozostają niezauważone aż do wdrożenia. Połączenie automatyzacji, ponownego użycia DTO i domyślnego działania jsonserializera zwiększa ryzyko. Typowe wzorce, w których niebezpieczna serializacja powoduje wyciek danych:
- Ponowne wykorzystanie encji EF Core bezpośrednio w odpowiedziach API.
Rejestrowanie obiektów szeregowanych, które zawierają dane uwierzytelniające. - Współdzielenie modeli między służbami wewnętrznymi i publicznymi CI/CD pipelines.
⚠️Niebezpieczny przykład, wyłącznie do celów edukacyjnych. Nie używać w środowisku produkcyjnym.
// Logs the full object, including sensitive fields
_logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result));
Jeśli Wynik zawiera Hash hasła or Token sesji, są teraz przechowywane w CI/CD dzienniki, naruszające zasady najmniejszych przywilejów. Nigdy nie ujawniaj prawdziwych tokenów, danych uwierzytelniających ani wewnętrznych adresów URL pipelines.
Wersja bezpieczna:
var options = new JsonSerializerOptions
{
IgnoreReadOnlyProperties = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
// Sanitize before serialization
result.SessionToken = null;
_logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options));
Uwaga edukacyjna: Przed zalogowaniem zdezynfekuj lub usuń pola wrażliwe i zawsze używaj bezpiecznych pól Opcje serializatora Json domyślne ustawienia wyjścia audytu.
Bezpieczne praktyki serializacji dla programistów
Programiści powinni traktować domyślne ustawienia system.text.json jako warstwę wygody, a nie politykę bezpieczeństwa. Bezpieczna serializacja tekstu systemowego w formacie JSON oznacza przejęcie kontroli nad tym, co opuszcza aplikację.
Praktyczne obrony
- Zdefiniuj wyraźne kontrakty: Utwórz dedykowane DTO dla odpowiedzi API, nigdy nie serializuj bezpośrednio encji EF ani domen.
- Skonfiguruj opcje globalne: Zastosowanie JsonSerializerOptions.DefaultIgnoreCondition oraz Zasady nazewnictwa nieruchomości.
- Aplikuj [JsonIgnore] lub konwertery: Ukryj lub przekształć poufne dane.
- Sprawdź poprawność wyników: Sprawdź rzeczywiste odpowiedzi seryjne w testach.
- Zautomatyzuj kontrole: Uwzględnij walidację serializacji w CI/CD.
Mini lista kontrolna działań zapobiegawczych
- Przejrzyj wszystkie klasy, używając serializacji System.Text.Json
- Oznacz sekrety lub dane uwierzytelniające za pomocą [JsonIgnore]
- Zdefiniuj globalne bezpieczne ustawienia domyślne w Program.cs or Startup.cs
- Unikaj bezpośredniej serializacji w logach
- Uwzględnij testy ekspozycji serializacji w swoim CI/CD pipeline
Uwaga edukacyjna: Bezpieczna serializacja polega na ograniczeniu ekspozycji, a nie zwiększaniu złożoności. Zadbaj o to, aby serializacja była jawna i możliwa do przetestowania.
Wykrywanie niebezpiecznej serializacji za pomocą automatycznego skanowania – System.Text.Json
Automatyczne skanowanie w CI/CD Pomaga wykryć ryzykowne użycie System.Text.Json i JsonSerializer. Narzędzia do analizy statycznej mogą identyfikować:
- Brak modeli [JsonIgnore].
- Wrażliwe pola eksponowane w DTO.
- Niebezpieczne globalne wartości domyślne (np. brak warunków ignorowania).
Przykład Pipeline Sprawdź
# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Run serialization security checks
run: dotnet xygeni validate --rules serialization --fail-on-risk
Uwaga edukacyjna: Integracja kontrole statyczne w wiadomościach CI/CD zapewnia spójną kontrolę nad serializacją tekstu systemowego JSON we wszystkich kompilacjach.
W jaki sposób Xygeni Code Security Wzmacnia bezpieczeństwo serializacji .NET
Xygeni Code Security zapewnia dogłębną detekcję niebezpiecznych domyślnych ustawień System.Text.Json i niewłaściwego użycia JsonSerializer w NET.
Identyfikuje wzorce takie jak:
- Pola wrażliwe są domyślnie serializowane.
- Niebezpieczne rejestrowanie danych JSON.
- brakujący [JsonIgnore] atrybuty.
- Nieprawidłowo skonfigurowane opcje serializacji JSON tekstu systemowego.
Poprzez integrację Xygeni najnowszych pre-commit hooks, CI/CD pipelineZa pomocą bramek PR lub PR można zablokować podatne na ataki wzorce serializacji przed ich scaleniem. Uzupełnia istniejący proces DevSecOps, przekształcając błędne konfiguracje serializacji w egzekwowalne zasady bezpieczeństwa.
Uwaga edukacyjna: Narzędzia bezpieczeństwa, takie jak Xygeni, automatycznie wymuszają higienę serializacji, dając deweloperom swobodę skupienia się na kodzie, a nie na audytach.
Wnioski – O System.Text.Json
System.Text.Json Serializacja jest szybka, ale wygoda często ukrywa ryzyko. Domyślna serializacja system.text.json uwzględnia wszystkie publiczne właściwości, co może prowadzić do wycieku danych wewnętrznych, tokenów lub identyfikatorów.
Programiści powinni:
- Przeprowadź audyt swoich modeli.
- Zastosowanie [JsonIgnore] i bezpieczne Opcje serializatora Json.
- Unikaj serializacji obiektów wewnętrznych.
- Zautomatyzuj skanowanie za pomocą narzędzi takich jak Xygeni Code Security.
Domyślna serializacja to nie tylko skrót dla programistów; to potencjalny wyciek danych. Ustaw jawną serializację, weryfikuj dane wyjściowe i automatyzuj sprawdzanie, ponieważ bezpieczne ustawienia domyślne nie zawsze są bezpieczne.







