Olá Marcos, tudo bem?
Isso está relacionado ao conceito de Mass Assignment Attack. Vamos ver como podemos resolver isso.
Utilizando DTOs para Prevenir Mass Assignment Attack: A maneira mais eficaz de prevenir esse tipo de ataque é utilizando DTOs (Data Transfer Objects). Ao utilizar DTOs, você define explicitamente quais campos são esperados na requisição, evitando que atributos indesejados sejam processados.
De forma prática, vamos considerar o seu exemplo. Suponha que você tenha uma classe Usuario
e uma classe UsuarioDTO
para representar os dados que devem ser recebidos na API.
Classe Usuario
:
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
@Entity(name = "Usuario")
@Table(name = "usuarios")
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String email;
private Boolean admin = false;
// restante do código omitido…
}
UsuarioDTO
:
public record UsuarioDTO(
@NotNull String nome,
@NotNull String email
) {}
Método no Controller:
@PostMapping
@Transactional
public void cadastrar(@RequestBody @Valid UsuarioDTO usuarioDTO) {
Usuario usuario = new Usuario();
usuario.setNome(usuarioDTO.nome());
usuario.setEmail(usuarioDTO.email());
repository.save(usuario);
}
Para garantir que apenas os campos definidos no UsuarioDTO
sejam aceitos, você pode utilizar a anotação @Valid
em conjunto com as anotações de validação do Bean Validation (como @NotNull
, @NotEmpty
, etc.).
Se você deseja que a aplicação retorne um erro quando atributos não mapeados são enviados, você pode configurar o Jackson para falhar em propriedades desconhecidas:
Utilizando DTOs e configurando o Jackson para falhar em propriedades desconhecidas, você pode prevenir o Mass Assignment Attack e garantir que apenas os campos esperados sejam processados pela sua aplicação.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.