Почему PasswordField использует строку вместо char[] в Vaadin?


Строкауязвима для значений пароля. Я заметил, что Ваадин PasswordField манипулируетпаролем как String.

Ниже приведен конструктор по умолчаниюPasswordField,

public PasswordField() {
  setValue("");
}

Мои вопросы:

  • безопасно ли его использовать PasswordField в Ваадине ?
  • что делает внутренний API для обеспечения безопасности пароля ?
3 6

3 ответа:

TL; DR Vaadin PasswordField это просто TextField. Вход скрыт только на стороне клиента, на стороне сервера передается открытым текстом.

Хотя вы можете использовать getConvertedValue() и еще setConvertedValue(Object value) для получения / установки значения в вашем собственном типе. Обратите внимание, что вы должны установить setConverter(Converter<T,?> converter) прежде чем использовать его.

Вот вам пример правильного использования диалога: создание собственного конвертера для String-MyType преобразование


ПОЛНОЕ ОБЪЯСНЕНИЕ

Ваадин TextField, PasswordField и еще TextArea являются ли все дети AbstractField<String>.

Текстовое Поле Vaadin Docs

Подробно:

java.lang.Object
  |_ com.vaadin.server.AbstractClientConnector
       |_ com.vaadin.ui.AbstractComponent
            |_ com.vaadin.ui.AbstractField<java.lang.String>
                 |_ com.vaadin.ui.AbstractTextField

PasswordField работает с String из-за своих родителей, в противном случае его следовало бы реализовать AbstractField<char[]>.

Кроме того, вPasswordField раздел из Vaadin Docs говорит явно:

Вы должны отметить что то PasswordField скрывает вход только от "через плечо" визуального наблюдения. Если соединение с сервером не зашифровано с помощью защищенного соединения, такого как HTTPS, вход передается открытым текстом и может быть перехвачен любым пользователем с низкоуровневым доступом к сети. Кроме того, фишинговые атаки, которые перехватывают входные данные в браузере, могут быть возможны путем использования дыр в безопасности выполнения JavaScript в браузере. браузер.


Хотя ... AbstractField<T> имеет getConvertedValue() и еще setConvertedValue(Object value) которые позволяют получить / установить значение в Object, которое вы предпочитаете. Обратите внимание, что перед его использованием необходимо установить setConverter(Converter<T,?> converter).

Вот вам пример правильного использования диалога: создание собственного конвертера для преобразования String-MyType

Вкратце из примера:

Name является простым POJO С firstName и lastName поля и их геттер/сеттер.

Класс преобразователя

public class StringToNameConverter implements Converter<String, Name> {

    public Name convertToModel(String text, Locale locale) {
        String[] parts = text.split(" ");
        return new Name(parts[0], parts[1]);
    }

    public String convertToPresentation(Name name, Locale locale)
            throws ConversionException {
        return name.getFirstName() + " " + name.getLastName();
    }

    public Class<Name> getModelType() {
        return Name.class;
    }

    public Class<String> getPresentationType() {
        return String.class;
    }
}

Основной класс

Name name = new Name("Rudolph", "Reindeer");
final TextField textField = new TextField("Name");
textField.setConverter(new StringToNameConverter());
textField.setConvertedValue(name);
addComponent(textField);
addComponent(new Button("Submit value", new ClickListener() {

    public void buttonClick(ClickEvent event) {
        Name name = (Name) textField.getConvertedValue();
    }

}));

Полный источник

Немного поздновато для этой вечеринки, но я хотел бы добавить свои 2 цента к тому, что уже обсуждалось.

Это может быть чисто confort и повторное использование кода, как PasswordField просто расширяется AbstractTextField на стороне BE, которая в основном является AbstractField<String> таким образом, вся логика манипулирования значениями, обработка событий и т. д. уже есть.

В противном случае, вероятно, придется реализовать AbstractField<char[]> и скопировать-вставить почти все из AbstractTextField только для этого. Или обобщить AbstractTextField или нечто подобное...

В любом случае, как уже говорилось, злоумышленнику потребуется доступ к серверу для сброса памяти, в случае, если у вас могут возникнуть большие проблемы, будь то извне или внутри организации (наверняка есть случаи, когда собственные сотрудники причинили вред по каким-то причинам): -)

Что касается FE, то VPasswordField контрагент создает вход типа password , и вопросы безопасности в отношении связи FE-BE уже есть это обсуждалось в ответе Паоло Форджиа.

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

Вы должны посмотреть, как это поле пароля обрабатывается в созданном javascript.