A interface ModelDriven apresenta uma explosão de segurança no struts2?

background: codifiquei uma classe ActionSupport do struts2 com ModelDriven. É um aplicativo da web de hibernação / primavera, usando OSIV e entidades anexadas na visualização (JSP).

Hoje recebi este e-mail do arquiteto 'me punindo' por colocar um objeto que tinha uma referência a uma entidade anexada no struts2 valuestack por meio doModelDriven<E> interface. Ele está correto ou o quê? Obviamente, isso é uma coisa séria que estou fazendo, mas não estou seguindo o que ele está dizendo, e realmente não sinto vontade de aceitar sua oferta e visitá-lo em sua mesa depois disso. Oh garoto. Hora de mudar de carreira.

--- do arquiteto ---

Billy, como discutimos anteriormente, você ainda está cometendo os mesmos erros no seu código repetidamente. Este é o quarto momento em que você cometeu esse erro e estou preocupado com a qualidade do seu trabalho. Uma coisa é fazer isso uma ou duas vezes, mas depois da quarta vez, pergunto-me se você é incapaz de compreender o que estou dizendo. A seguir, explicarei tudo para você. Se você não o receber depois de ler este e-mail, venha à minha mesa e examinaremos isso. Isso precisa parar imediatamente, e eu quero que todo o seu código seja refatorado antes do final do dia, corrigindo esse erro. Se qualquer código como esse entrar em produção, teremos um sério problema de segurança em nossas mãos. Observe também que estou copiando Dave para que uma repreensão adequada possa ser emitida. Também vou recomendar a Dave que você seja transferido de um desenvolvedor de nível III para nível II. Leia o seguinte e aprenda-o, e refatorar todo o seu código, conforme indicado.

Sobre os objetos de ligação:

Quando uma classe de ação do Struts2 é marcada com a interface ModelDriven, o modelo será vinculado aos elementos do formulário na página HTML. Por exemplo, se um formulário HTML tiver um campo chamado userName e uma classe de ação for definida como:

classe pública UserAction estende o ActionSupport implementa ModelDriven

E UserModel é um POJO da seguinte maneira:

public class UserModel {
  private String userName;

  public String getUserName() {
      return userName;
  }

  public void setUserName(String userName) { 
      this.userName = userName;
  }
}

Quando o formulário é enviado, desde que a Ação contenha uma instância do UserModel, o struts2 vinculará o campo userName ao UserModel.userName, preenchendo automaticamente o valor.

Essa simplicidade tem um alto custo para usuários mal-intencionados, no entanto. Se um objeto for declarado como ModelDriven, o usuário final, o usuário que está navegando, terá acesso ao gráfico de modelos por meio dos configuradores de modelos. Veja este caso, por exemplo:

classe pública UserAction estende o ActionSupport implementa ModelDriven

e...

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;
  }
}

e...

@Entity
public class UserEntity {
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
 }

assumindo que o padrão OSIV esteja sendo usado e a entidade UserEntity esteja anexada.

Um usuário astuto com um pouco de conhecimento prévio ou tempo em suas mãos pode:

/myform?userName=billy&userEntity.password=newpassword

supondo que a Entidade seja salva no final da sessão, o resultado acima altera a senha do Billy.

O ponto é que o gráfico de objetos está disponível!

Ao usar ModelDriven, e usar a alternativa é uma abordagem horrível, você deve definir modelos de baixa granularidade que são colocados na pilha de valor e depois copiar do modelo para o objeto de destino antes de enviar a resposta e permitir que a transação seja confirmada.

questionAnswers(2)

yourAnswerToTheQuestion