Broken Object Property Level Authorization
Et API-endpoint er sårbart, hvis det tillader en bruger at tilgå eller ændre følsomme objektdata uden autorisation, kendt som "Excessive Data Exposure" og "Mass Assignment". Eksempler på angreb viser, hvordan manglende validering kan give adgang til private oplysninger eller uautoriserede ændringer, som at justere bookingpriser eller låse blokeret indhold op. For at forhindre dette bør API'er begrænse data, vælge specifikke egenskaber, der returneres, og implementere skemabaseret validering af adgang til følsomme data.
For at løse sårbarheder ved "Excessive Data Exposure" og "Mass Assignment" i API-endpoints kan man:
- Valider brugeradgang til objekt-egenskaber: Sørg for, at kun autoriserede brugere kan tilgå de eksponerede objektdata. Dette reducerer risikoen for adgang til følsomme oplysninger.
- Begræns data, der returneres: Undgå generiske metoder som
to_json()
ogto_string()
. Vælg i stedet præcise objekt-egenskaber, der er nødvendige for formålet, og returnér kun dem. - Implementer skemabaseret validering: Brug en skemavalidering for at definere, hvilke data der må returneres og ændres, som en ekstra sikkerhed.
- Undgå automatisk data-binding: Brug ikke funktioner, der binder input direkte til objekt-egenskaber. Tillad kun opdatering af egenskaber, der specifikt skal kunne ændres af brugeren.
Validér brugeradgang til objekt-egenskaber
I en microservice-arkitektur kan man bruge en middleware eller en adgangsvalidering, som kontrollerer, om brugeren har adgang til de specifikke dataegenskaber.
public class AccessValidator
{
public bool ValidateUserAccess(Guid userId, string propertyName)
{
// Logik til at validere brugeradgang for specifikke dataegenskaber
var authorizedProperties = GetAuthorizedPropertiesForUser(userId);
return authorizedProperties.Contains(propertyName);
}
private List<string> GetAuthorizedPropertiesForUser(Guid userId)
{
// Returner en liste over tilladte egenskaber baseret på brugerens rolle
return new List<string> { "Name", "Email" };
}
}
Hvor bruges dette i en microservice?
Denne type validering kan implementeres i en fælles auth-service eller som middleware, der håndterer alle API-requests til de relevante endpoints og sikrer, at kun nødvendige egenskaber er tilgængelige for brugeren.
Begræns data, der returneres
For at undgå utilsigtet eksponering af data, kan du kun vælge specifikke egenskaber til responsen i controlleren.
public class UserService
{
public object GetUserData(Guid userId)
{
var user = GetUserFromDatabase(userId);
// Returner kun nødvendige egenskaber
return new {
Name = user.Name,
Email = user.Email
};
}
}
Hvor bruges dette i en microservice?
Her kan man skabe en DTO for kun at returnere de nødvendige egenskaber i microservices, som typisk håndterer brugerprofiler eller følsomme data. DTO'er hjælper også med at standardisere datainput/output på tværs af services.
Implementer skemabaseret validering
Brug en skemavalidering som en ekstra sikkerhed, især hvis API'et modtager inputdata, hvor kun nogle egenskaber må kunne ændres.
public class UpdateUserRequest
{
public string Name { get; set; }
public string Email { get; set; }
// Denne egenskab er privat og kan ikke ændres via API
private string Role { get; set; }
}
public class UserController : ControllerBase
{
[HttpPut("api/user/update")]
public IActionResult UpdateUser([FromBody] UpdateUserRequest request)
{
if (!ModelState.IsValid)
return BadRequest();
// Kun Name og Email kan opdateres
UpdateUserInDatabase(request);
return Ok();
}
}
Hvor bruges dette i en microservice?
Dette kan bruges i services, hvor opdateringer modtages fra klienten. Skemavalidering forhindrer uautoriserede ændringer af egenskaber, som kun backend eller bestemte services bør håndtere.
Undgå automatisk data-binding
Undgå ObjectMapper
eller lignende teknikker, som kan føre til "Mass Assignment" sårbarhed. Lav i stedet manuelt felt-for-felt-binding, så kun specifikke egenskaber kan opdateres.
public class UserController : ControllerBase
{
[HttpPut("api/user/update")]
public IActionResult UpdateUser(Guid userId, string name, string email)
{
var user = GetUserFromDatabase(userId);
// Kun specifikke egenskaber opdateres manuelt
user.Name = name;
user.Email = email;
SaveUserToDatabase(user);
return Ok();
}
}
Hvor bruges dette i microservices?
Denne metode er effektiv i brugerservices, hvor man ønsker manuel kontrol over, hvilke felter brugeren kan opdatere, og hvor uautoriserede felter som "role" eller "permissions" ikke må kunne ændres.