배경 : ModelDriven을 사용하여 Struts2 ActionSupport 클래스를 코딩했습니다. 보기 (JSP)에서 OSIV 및 첨부 된 엔티티를 사용하여 최대 절전/스프링 웹 응용 프로그램입니다. ModelDriven 인터페이스가 struts2에서 보안 위협을 제기합니까?
은 내가ModelDriven<E>
인터페이스를 통해 struts2의 valuestack에 부착 된 개체에 대한 참조를 가지고 객체 을 가하고 저를 '처벌'건축가에서 오늘이 이메일을 받았습니다. 그는 맞습니까? 또는 무엇입니까? 분명히 이것은 내가하는 중대한 일이지만 그가 말한 것을 따르지 않고 있으며, 나는 그 후에 그의 제안을 받아 들여 그의 책상에서 그를 방문하는 것 같지 않습니다. 오 소년. 경력을 바꿀 시간. 우리는 전술 한 바와 같이
는 --- 건축가에서 ---
빌리, 당신은 여전히 계속해서 또 다시 코드 에 같은 실수를하고 있습니다. 이것은 당신이이 오류를 만든 네 번째 시간이며 나는 당신의 작업의 질에 대해 에 대해 우려하고 있습니다. 이것을 한 번 또는 두 번하는 것이 한 가지이지만, 네 번째 시간 후에 후에 나는 내가 말하는 것을 이해할 수 없는지 궁금합니다. 다음은 당신을 위해 그것을 밖으로 철자합니다. 이 이메일을 읽은 후에 가져 오지 못하면 내 책상에 와서 우리가 살펴 보겠습니다. 이 작업은 즉시 중단되어야하며이 실수를 바로 잡기 전에 코드가 리팩토링되기를 바랍니다. 과 같은 코드가 있으면 생산에 지장이 생기며 심각한 보안 문제가 발생할 수 있습니다. 또한 적절한 견책을 줄 수 있도록 Dave를 복사하고 있습니다. 저는 Dave에게 당신이 Level III에서 Level II로 옮겨 갈 것을 추천 할 것입니다. 다음 내용을 읽고 배우고 지시 한대로 모든 코드를 리팩토링하십시오. 바인딩 된 객체
:
Struts2 액션 클래스는 ModelDriven 인터페이스로 표시되어
는 모델 는 HTML 페이지의 양식 요소에 바인딩됩니다.공용 클래스 UserAction는 ActionSupport를가
ModelDriven
구현 확장 그리고 다음과 같이 UserModel는 POJO입니다 : 예를 들어, HTML 양식 이는 userName라는 필드가 있고 것처럼 액션 클래스는 정의public class UserModel {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
양식이 제출되면 Action에 UserModel의 인스턴스가 포함되어있는 한 struts2 은 userName 필드를 UserModel.userName에 바인딩하여 값을 자동으로 채 웁니다.
그러나이 단순성은 악의적 인 사용자에게 높은 비용을 초래합니다. 객체가 ModelDriven으로 으로 선언되면 최종 사용자 인 브라우징 사용자는 모델 설정자를 통해 모델 그래프에 액세스 할 수 있습니다. 예를 들어,이 경우를 보자
공용 클래스 UserAction는 ActionSupport를가
및 ModelDriven
구현 연장 ...public class UserModel {
private String userName;
private UserEntity userEntity;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
pubic UserEntity getUserEntity() {
return userEntity;
}
}
와 ...
@Entity
public class UserEntity {
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
OSIV 패턴 가정이 사용되고 엔티티 UserEntity가 첨부됩니다.
그의 손에 앞 지식이나 시간의 비트와 함께 교활 사용자 수 엔티티를 가정
/myform?userName=billy&userEntity.password=newpassword
세션, 빌리의 암호를 변경하는 위의 결과의 마지막에 저장됩니다.
요점은 객체 그래프를 사용할 수 있다는 것입니다.
ModelDriven을 사용하고, 대안을 사용하면, 당신은 valuestack에 배치 세밀한 모델을 정의하고 응답을 전송하고 거래를 허용하기 전에 에 모델에서 대상 개체를 복사해야 끔찍한 방법입니다 커밋하기.