Как исправить «небезопасную привязку объекта» в Spring Boot с помощью DTO для сопоставления объектов?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить «небезопасную привязку объекта» в Spring Boot с помощью DTO для сопоставления объектов?

Сообщение Anonymous »

Я работаю над приложением Spring Boot, в котором напрямую привязываю входящие запросы JSON к DTO (объектам передачи данных) с помощью @RequestBody. Во время проверки безопасности я был отмечен уязвимостью «Небезопасная привязка объектов», поскольку мои DTO напрямую связаны с объектами, что потенциально допускает вредоносный ввод или чрезмерную привязку.
Код контроллера:

Код: Выделить всё

    @PostMapping("/createDetails")
public ResponseEntity createDetails(@Valid @RequestBody MyEntityDTO myEntityDTO) {
log.debug("Inside createDetails method, DTO - {}", myEntityDTO);

Integer userId = userService.getLoggedInUserId();
myEntityDTO.setUserId(userId);

myEntityService.saveEntity(myEntityDTO.toEntity());
return ResponseEntity.ok("Entity Created Successfully");
}
Класс DTO:

Код: Выделить всё

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.NonNull;
import java.util.List;
import java.util.stream.Collectors;

@Data
public class MyEntityDTO {

private Integer entityId;
private String entityName;
private Integer entityNumber;
private String status;
private List subEntities;

@JsonIgnore
public MyEntity toEntity(@NonNull Integer userId) {
MyEntity myEntity = new MyEntity();
myEntity.setEntityId(this.entityId);
myEntity.setEntityName(this.entityName != null ? this.entityName : "UNASSIGNED");
myEntity.setEntityNumber(this.entityNumber);
myEntity.setStatus(this.status);
myEntity.setUserId(userId);

MyEntityRelation relation = new MyEntityRelation();
relation.setStatus("ACTIVE");
relation.setSubEntities(this.subEntities != null ? this.subEntities.stream()
.map(MySubEntityDTO::toEntity)
.collect(Collectors.toList()) : null);
relation.setMyEntity(myEntity);

myEntity.setRelations(relation);
return myEntity;
}
}
Класс сущности (упрощенный):

Код: Выделить всё

import javax.persistence.*;
import java.util.List;

@Entity
public class MyEntity {

@Id
private Integer entityId;
private String entityName;
private Integer entityNumber;
private String status;
private Integer userId;

@OneToMany(mappedBy = "myEntity", cascade = CascadeType.ALL)
private List relations;

// Getters, Setters, and Named Queries...
}
Проблема.
Уязвимость возникает из-за того, что прямая привязка пользовательских входных данных к DTO и преобразование их в сущности может позволить злоумышленнику вводить неожиданные значения, обходить проверку или манипулировать конфиденциальными полями, такими как статус или идентификатор пользователя
Что я уже пробовал:
  • Я добавил @ Действительно для DTO и проверки на уровне поля. аннотации.
  • Я игнорировал конфиденциальные поля, такие как userId, с помощью @JsonIgnore.


Подробнее здесь: https://stackoverflow.com/questions/792 ... ty-mapping
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»