Интерфейс ModelDriven представляет угрозу безопасности в Struts2?

Справочная информация: я кодировал класс ActionSupport struts2 с ModelDriven. Это веб-приложение Hibernate / Spring, использующее OSIV и присоединенные сущности в представлении (JSP).

Сегодня я получил это электронное письмо от архитектора, «наказывающего» меня за то, что я поместил объект, имеющий ссылку на присоединенную сущность, в стек значений struts2 черезModelDriven<E> интерфейс. Он прав или как? Очевидно, это серьезная вещь, которую я делаю, но я не следую тому, что он говорит, и мне действительно не хочется принимать его предложение и после этого навещать его за столом. О, парень. Время менять карьеру.

--- от архитектора ---

Билли, как мы уже обсуждали, вы по-прежнему совершаете одни и те же ошибки в своем коде снова и снова. Это уже четвертый раз, когда вы совершаете эту ошибку, и я беспокоюсь о качестве вашей работы. Одно дело сделать это один или даже два раза, но после четвертого раза я задаюсь вопросом, не можете ли вы понять то, что я говорю. Следующее объяснит это для вас. Если вы не получите его после прочтения этого электронного письма, тогда приходите ко мне на стол и мы просмотрим его. Это должно немедленно прекратиться, и я хочу, чтобы весь ваш код был реорганизован до конца дня, чтобы исправить эту ошибку. Если какой-либо код, подобный этому, попадет в производство, у нас будет серьезная проблема с безопасностью. Также обратите внимание, что я копирую Дэйва, чтобы можно было сделать правильный выговор. Я также собираюсь порекомендовать Дэйву перейти с уровня III на уровень II для разработчиков. Прочитайте следующее и, пожалуйста, изучите его, и рефакторинг всего вашего кода, как я указал.

Об объектах привязки:

Если класс действия Struts2 помечен с помощью интерфейса ModelDriven, модель будет привязана к элементам формы на странице HTML. Например, если форма HTML имеет поле с именем userName и класс действия определен как:

Открытый класс UserAction расширяет ActionSupport и реализует ModelDriven

И UserModel является POJO следующим образом:

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 и использовании альтернативы это ужасный подход, вы должны определить мелкозернистые модели, которые помещаются в стек значений, а затем скопировать из модели в целевой объект перед отправкой ответа и разрешением транзакции зафиксировать.

Ответы на вопрос(2)

Ваш ответ на вопрос