Тивки ризици во стандардната серијализација на системскиот текст во JSON
Библиотеката System.Text.Json стана стандардна за повеќето модерни .NET апликации. Таа е ефикасна, лесна и длабоко интегрирана во ASP.NET Core. Но, истите стандардни поставки што ја прават едноставна, исто така, воведуваат тивки безбедносни ризици. Стандардно, серијализацијата System.Text.Json автоматски ги серијалира сите јавни својства, дури и оние што содржат чувствителни податоци како што се токени или внатрешни идентификатори. Програмерите често се потпираат на овие стандардни поставки за брзина, превидувајќи дека би можеле да откријат доверливи информации во одговорите на API (jsonserializer).
⚠️Небезбеден пример, само за образовни цели. Не користете во производство.
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..."} Ова однесување на jsonserializer открива SessionToken бидејќи сите јавни својства се серијализираат автоматски.
Безбедна верзија:
public class UserProfile { public string UserName { get; set; } public string Email { get; set; } [JsonIgnore] // Prevent serialization of sensitive fields public string SessionToken { get; set; } } Образовна белешка: Секогаш користете [JsonIgnore] за чувствителни својства или дизајнирајте одделни DTO што содржат само полиња наменети за серијализација.
Како JsonSerializer ја проширува изложеноста без предупредување
JsonSerializer-от во System.Text.Json не запира на површинско ниво. Тој рекурзивно поминува низ вгнездени објекти, колекции и вредности на enum, серијализирајќи сè до кое може да пристапи. Без експлицитно исклучување, ова лесно може да доведе до вгнездени протекувања на податоци, особено кога внатрешните објекти содржат токени, идентификатори или клучеви за сесија.
⚠️Небезбеден пример, само за образовни цели. Не користете во производство.
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"}} Вгнездениот објект ја прави серијализацијата на json текстот на системот да вклучува чувствителни Пристапен токен автоматски.
Безбедна верзија:
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); Образовна белешка: Секогаш дефинирај Опции за JsonSerializer експлицитно и прегледајте ги вгнездените типови за ненамерно изложување на податоци.
Влијание во реалниот свет кај API-јата и микросервисите
Во реалните .NET апликации, овие ризици од серијализација честопати остануваат незабележани сè до по распоредувањето. Комбинацијата од автоматизација, повторна употреба на DTO и стандардно однесување на jsonserializer ја зголемува изложеноста. Вообичаени шеми каде што небезбедната серијализација протекува податоци:
- Повторно користење на ентитетите на EF Core директно во одговорите на API.
Евидентирање на серијализирани објекти што содржат податоци за автентикација. - Споделување модели помеѓу внатрешните и јавните служби во CI/CD pipelines.
⚠️Небезбеден пример, само за образовни цели. Не користете во производство.
// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); Ако резултира содржи PasswordHash or SessionToken, овие сега се складирани во CI/CD логови, кршење принципи на најмалку привилегирани лица. Никогаш не откривајте вистински токени, акредитиви или внатрешни URL-адреси во pipelines.
Безбедна верзија:
var options = new JsonSerializerOptions { IgnoreReadOnlyProperties = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); Образовна белешка: Дезинфицирајте или поништете ги чувствителните полиња пред да се најавите и секогаш користете безбедни Опции за JsonSerializer стандардни вредности за излез од ревизијата.
Безбедни практики за серијализација за програмери
Програмерите треба да ги третираат стандардните вредности на system.text.json како слој за погодност, а не како безбедносна политика. Безбедната серијализација на JSON системски текст значи преземање контрола врз она што ја напушта вашата апликација.
Практична одбрана
- Дефинирајте експлицитни договори: Креирајте наменски DTO за API одговори, никогаш не серијализирајте директно EF или доменски ентитети.
- Конфигурирајте ги глобалните опции: Користете JsonSerializerOptions.DefaultIgnoreCondition Политика за именување на имот.
- Применуваат [JsonIgnore] или конвертори: Сокриј или трансформирај чувствителни податоци.
- Потврди излези: Проверете ги вистинските серијализирани одговори во тестовите.
- Автоматизирајте проверки: Вклучи валидација на серијализација во CI/CD.
Мини превентивна контролна листа
- Прегледајте ги сите класи користејќи серијализација System.Text.Json
- Означете ги тајните или акредитивите со [JsonIgnore]
- Дефинирајте глобални безбедни стандардни вредности во Програма.cs or Startup.cs
- Избегнувајте директна серијализација во логовите
- Вклучете тестови за изложеност на серијализација во вашите CI/CD pipeline
Образовна белешка: Безбедната серијализација е за ограничување на изложеноста, а не за додавање сложеност. Направете ја серијализацијата експлицитна и проверлива.
Откривање на небезбедна серијализација со автоматско скенирање – System.Text.Json
Автоматизирано скенирање во CI/CD помага да се открие ризична употреба на System.Text.Json и JsonSerializer. Алатките за статичка анализа можат да идентификуваат:
- Недостасуваат модели [JsonIgnore].
- Чувствителни полиња изложени во DTO.
- Небезбедни глобални стандардни вредности (на пр., недостаток на услови за игнорирање).
пример Pipeline Провери
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Run serialization security checks run: dotnet xygeni validate --rules serialization --fail-on-risk Образовна белешка: Интегрирање статички проверки во вашиот CI/CD Обезбедува конзистентна контрола врз серијализацијата на JSON на системскиот текст низ сите верзии.
Како Xygeni Code Security Ја зајакнува безбедноста на .NET серијализацијата
Xygeni Code Security Овозможува длабинско откривање на небезбедни стандардни поставки на System.Text.Json и злоупотреба на JsonSerializer во NET.
Ги идентификува моделите како што се:
- Чувствителните полиња се серијализираат по дифолт.
- Небезбедно евидентирање на JSON податоци.
- Недостасува [JsonIgnore] атрибути.
- Погрешно конфигурирани опции за серијализација на JSON за системски текст.
Со интегрирање Xygeni во pre-commit hooks, CI/CD pipelines, или PR порти, можете да блокирате ранливи шеми на серијализација пред да се спојат. Го надополнува вашиот постоечки DevSecOps процес со претворање на погрешните конфигурации на серијализацијата во применливи безбедносни политики.
Образовна забелешка: Безбедносните алатки како Xygeni автоматски ја спроведуваат хигиената на серијализацијата, ослободување на програмерите да се фокусираат на код, а не на ревизии.
Заклучок – За System.Text.Json
System.Text.Json ја прави серијализацијата брза, но практичноста честопати ја крие изложеноста. Стандардната серијализација system.text.json ги вклучува сите јавни својства, потенцијално протекувајќи внатрешни податоци, токени или идентификатори.
Програмерите треба:
- Ревидирајте ги нивните модели.
- Користете [JsonIgnore] и безбедно Опции за JsonSerializer.
- Избегнувајте серијализација на внатрешни објекти.
- Автоматизирајте го скенирањето со помош на алатки како што се Xygeni Code Security.
Стандардната серијализација не е само кратенка за развивачот; тоа е потенцијално истекување на податоци. Направете ја серијализацијата експлицитна, проверете ги излезните податоци и автоматизирајте ги проверките, бидејќи безбедните стандардни вредности не се секогаш безбедни.






