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