Wirft die ModelDriven-Schnittstelle einen Sicherheitsexplot in struts2 auf?

background: Ich habe eine struts2 ActionSupport-Klasse mit ModelDriven codiert. Es handelt sich um eine Web-App für den Ruhezustand / Frühling, die OSIV und angehängte Entitäten in der Ansicht (JSP) verwendet.

Ich habe diese E-Mail heute von dem Architekten erhalten, der mich "bestraft" hat, weil ich ein Objekt, das einen Verweis auf eine angehängte Entität enthielt, über das @ auf den struts2-Wertestack gesetzt habModelDriven<E> Schnittstelle. Stimmt er oder was? Offensichtlich ist dies eine ernste Sache, die ich tue, aber ich folge nicht dem, was er sagt, und ich habe wirklich keine Lust, sein Angebot anzunehmen und ihn danach an seinem Schreibtisch zu besuchen. Oh Junge. Zeit für einen Karrierewechsel.

--- vom Architekten ---

Billy, wie wir bereits besprochen haben, machen Sie immer wieder dieselben Fehler in Ihrem Code. Dies ist das vierte Mal, dass Sie diesen Fehler gemacht haben, und ich bin besorgt über die Qualität Ihrer Arbeit. Es ist eine Sache, dies ein- oder zweimal zu machen, aber nach dem vierten Mal frage ich mich, ob Sie nicht verstehen können, was ich sage. Das Folgende wird es für Sie darlegen. Wenn Sie es nach dem Lesen dieser E-Mail nicht erhalten, kommen Sie zu meinem Schreibtisch und wir werden es durchgehen. Das muss sofort aufhören und ich möchte, dass Ihr gesamter Code vor dem Ende des Tages überarbeitet wird, um diesen Fehler zu korrigieren. Wenn ein Code wie dieser in die Produktion gelangt, haben wir ein ernstes Sicherheitsproblem. Beachten Sie auch, dass ich Dave hierauf kopiere, damit ein ordnungsgemäßer Verweis ausgestellt werden kann. Ich werde Dave auch empfehlen, dass Sie von einem Entwickler der Stufe III zu einem Entwickler der Stufe II wechseln. Lesen Sie das Folgende und lernen Sie es, und überarbeiten Sie Ihren gesamten Code wie angegeben.

Über die Bindungsobjekte:

Wenn eine Struts2-Aktionsklasse mit der ModelDriven-Schnittstelle markiert ist, wird das Modell an die Formularelemente in der HTML-Seite gebunden. Wenn ein HTML-Formular beispielsweise ein Feld mit dem Namen userName enthält und eine Aktionsklasse wie folgt definiert ist:

public class UserAction erweitert ActionSupport implementiert ModelDriven

Und UserModel ist ein POJO wie folgt:

public class UserModel {
  private String userName;

  public String getUserName() {
      return userName;
  }

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

Wenn das Formular gesendet wird, bindet struts2, solange die Aktion eine Instanz von UserModel enthält, das Feld userName an UserModel.userName und füllt den Wert automatisch mit Daten.

Diese Einfachheit ist jedoch für böswillige Benutzer mit hohen Kosten verbunden. Wenn ein Objekt als ModelDriven deklariert ist, hat der Endbenutzer, dh der Browsing-Benutzer, über die Modelsetter Zugriff auf das Modelldiagramm. Nehmen Sie diesen Fall zum Beispiel:

public class UserAction erweitert ActionSupport implementiert ModelDriven

und..

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

und..

@Entity
public class UserEntity {
    private String password;

    public String getPassword() {
        return password;
    }

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

ngenommen, das OSIV-Muster wird verwendet, und die Entität UserEntity ist angehäng

Ein geschickter Benutzer mit ein wenig Vorwissen oder Zeit in seinen Händen kann:

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

Angenommen, die Entität wird am Ende der Sitzung gespeichert. Das oben Gesagte führt dazu, dass Billys Passwort geändert wird.

Der Punkt ist, der Objektgraph ist verfügbar!

Wenn die Verwendung von ModelDriven und die Verwendung der Alternative ein schrecklicher Ansatz ist, müssen Sie feinkörnige Modelle definieren, die auf dem Wertestapel abgelegt werden, und dann vom Modell zum Zielobjekt kopieren, bevor Sie die Antwort senden und die Transaktion festschreiben lassen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage