2010-07-26 3 views
2

background: Я закодировал класс ActionSupport struts2 с ModelDriven. Это приложение hibernate/spring web, использующее OSIV и прикрепленные объекты в представлении (JSP).Интерфейс ModelDriven представляет собой взлом безопасности в struts2?

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

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

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

О связывании объектов:

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

общественный класс 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 свяжет имя пользователя user_name с 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 

предполагая Entity сохраняется в конце сессии, приведенные выше результаты в изменении пароля Билли.

Дело в том, что график объекта доступен!

При использовании ModelDriven, и с использованием альтернативы является ужасным подход, вы должны определить мелкозернистых модели, которые размещаются на valuestack, а затем скопировать из модели целевого объекта перед отправкой ответа и позволяя сделки совершать.

ответ

1

Ваш архитектор прав, помещение объектов, имеющих доступ к конфиденциальной информации о ValueStack, создает потенциальную угрозу безопасности. Злоумышленник действительно может сбросить пароль с помощью вышеупомянутой атаки.

НО:

Поскольку он является архитектором, он должен быть разработан способ для надлежащей проверки/ограничения входных параметров. Использование ParamsInterceptor в Struts2 довольно просто, чтобы только определенные параметры были переданы в действие. Таким образом, это не ваша работа, которая отстой, это ваша система. Разработчики должны иметь возможность сосредоточиться на реализации бизнес-логики. Архитектура должна предоставить инфраструктуру.

Приветствия,

ж

0

ModelDriven перехватчик слепа

Да Модель интерфейс может быть источником проблемы безопасности, если не обрабатывать входящие параметры, которые будут стоять перед дыры безопасности.

Вы должны использовать перехватчик параметров.

В struts.xml изменить Params перехватчик как:

<interceptor-ref name="params"> 
    <param name="excludeParams">\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['\w+'\])|(\('\w+'\)))*</param> 
</interceptor-ref> 

Затем в действие реализации ParameterNameAware и писать acceptableParameterName.

public class sample implements ParameterNameAware(){ 
     public boolean acceptableParameterName(String parameterName) { 
     if (("username".equals(parameterName) || 
      "firstname".equals(parameterName) || 
      "lastname".equals(parameterName)) 
      return true; 
     else 
      return false; 
    } 

} 

выше важно, если ваш Пользователь POJO имеет много других свойств и только некоторые из них должны быть получить от пользователя.

Если вы используете множество действий ModelDriven, вы можете сделать их общими.

Создайте базовое действие, которое расширяет ParameterNameAware. Затем попробуйте разработать общий подход, чтобы иметь список ваших действий и действительные параметры:

Мы использовали весну, чтобы прочитать список действий и их приемлемые параметры.В весеннем XML мы добавили:

<util:properties id="actionsValidParameters" 
    location="classpath:/configs/actions-valid-parameters.properties" /> 

actions-valid-parameters.properties как:

save-user=username,description,firstname,lastname 
save-address=zipcode,city,detail,detail.addLine1,detail.addLine2,detail.no 

Подсказка, если адрес объекта имеет объект Detail, и вы хотите, чтобы заполнить некоторые свойства в деталях объекта, убедитесь, что вы включите «деталь» в приведенный выше список.

Действие как

public class BaseActionSupport extends ActionSupport implements ParameterNameAware 
{ 

@Resource(name = "actionsValidParameters") 
public Properties actionsValidParameters; 

@Override 
public boolean acceptableParameterName(String parameterName) { 

    String actionName = ActionContext.getContext().getName(); 
    String validParams = (String) actionsValidParameters.get(actionName); 

    //If the action is not defined in the list, it is assumed that the action can accept all parameters. You can return false so if the action is not in the list no parameter is accepeted. It is up to you! 
    if(StringUtils.isBlank(validParams)) 
     return true; 
    // Search all the list of parameters. 
      //You can split the validParams to array and search array. 
    Pattern pattern = Pattern.compile("(?<=^|,)" + parameterName 
      + "(?=,|$)"); 
    Matcher matcher = pattern.matcher(validParams); 
    boolean accepeted = matcher.find(); 
    LOG.debug(
      "The {} parameter is {} in action {}, Position (excluding the action name) {} , {} , mathced {} ", 
      parameterName, accepeted, actionName, matcher.start(), matcher.end(), 
      matcher.group()); 
    return accepeted; 
    } 

} 

Теперь wrtie свои действия как

public class UserAction extends BaseActionSupport implements 
     ModelDriven<User>{ 


} 
Смежные вопросы