Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Dúvida sobre Mass Assignment Attack

Olá pessoal, me surgiu uma dúvida, eu sei que na minha requisição eu preciso enviar 3 campos obrigatórios, por exemplo.

Porém, suponhamos que eu envie uma requisição diferente (segunda imagem), como eu poderia fazer para validar se o que eu passei na requisição é válido? No caso, como teste, eu passei um atributo não mapeado e retornou código 200, não deveria retornar um código de erro?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

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 ✓.

Irei pesquisar sobre a configuração do jackson. Obrigado!