Почему PasswordField использует строку вместо char[] в Vaadin?
Строкауязвима для значений пароля. Я заметил, что Ваадин PasswordField
манипулируетпаролем как String
.
Ниже приведен конструктор по умолчаниюPasswordField
,
public PasswordField() {
setValue("");
}
Мои вопросы:
- безопасно ли его использовать
PasswordField
в Ваадине ? - что делает внутренний API для обеспечения безопасности пароля ?
3 ответа:
TL; DR Vaadin
PasswordField
это простоTextField
. Вход скрыт только на стороне клиента, на стороне сервера передается открытым текстом.Хотя вы можете использовать
getConvertedValue()
и ещеsetConvertedValue(Object value)
для получения / установки значения в вашем собственном типе. Обратите внимание, что вы должны установитьsetConverter(Converter<T,?> converter)
прежде чем использовать его.Вот вам пример правильного использования диалога: создание собственного конвертера для String-MyType преобразование
ПОЛНОЕ ОБЪЯСНЕНИЕ
Ваадин
TextField
,PasswordField
и ещеTextArea
являются ли все детиAbstractField<String>
.Подробно:
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(); } }));
Полный источник
com.vaadin.ui.PasswordField
com.vaadin.ui.TextField
com.vaadin.ui.TextArea
com.vaadin.ui.AbstractField<T>
com.vaadin.ui.AbstractField<T>#getConvertedValue()
com.vaadin.ui.AbstractField<T>#setConvertedValue(Object value)
com.vaadin.ui.AbstractField<T>#setConverter(Converter<T,?> converter)
- Vaadin Docs
TextField
- Vaadin Docs
PasswordField
- пример: создание собственного конвертера для преобразования String-MyType
- разница между DTO, VO, POJO, JavaBeans?
- ответ Морфика
Немного поздновато для этой вечеринки, но я хотел бы добавить свои 2 цента к тому, что уже обсуждалось.
Это может быть чисто confort и повторное использование кода, как
PasswordField
просто расширяетсяAbstractTextField
на стороне BE, которая в основном являетсяAbstractField<String>
таким образом, вся логика манипулирования значениями, обработка событий и т. д. уже есть.В противном случае, вероятно, придется реализовать
AbstractField<char[]>
и скопировать-вставить почти все изAbstractTextField
только для этого. Или обобщитьAbstractTextField
или нечто подобное...В любом случае, как уже говорилось, злоумышленнику потребуется доступ к серверу для сброса памяти, в случае, если у вас могут возникнуть большие проблемы, будь то извне или внутри организации (наверняка есть случаи, когда собственные сотрудники причинили вред по каким-то причинам): -)
Что касается FE, то
VPasswordField
контрагент создает вход типа password , и вопросы безопасности в отношении связи FE-BE уже есть это обсуждалось в ответе Паоло Форджиа.
Когда код vaadin запускается в вашем веб-браузере, он больше не находится в JVM, поэтому использование строки в этом случае нормально. Пароль будет сохранен в виде строки Java на стороне сервера, поэтому для доступа к этой строке пароля злоумышленник должен получить доступ к вашему серверу.
Вы должны посмотреть, как это поле пароля обрабатывается в созданном javascript.