字符串易受攻击表示密码值。我注意到Vaadin PasswordField
将密码操纵为String
。
以下是PasswordField
的默认构造函数,
public PasswordField() {
setValue("");
}
我的问题:
PasswordField
是否安全?答案 0 :(得分:5)
TL; DR Vaadin PasswordField
是一个简单的TextField
。输入隐藏在客户端,服务器端以明文形式传输。
虽然您可以使用getConvertedValue()
和setConvertedValue(Object value)
获取/设置您自己类型的值。请注意,您必须在使用前设置setConverter(Converter<T,?> converter)
。
这里有一个如何正确使用对话的示例:Creating your own converter for String - MyType conversion
完整解释
Vaadin 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
section from Vaadin Docs明确说明:
你应该注意到
PasswordField
隐藏输入仅仅来自&#34;肩膀&#34;视觉观察。除非使用安全连接(例如HTTPS)加密服务器连接,否则输入将以明文传输,并且可能被对网络进行低级访问的任何人拦截。此外,通过利用浏览器中的JavaScript执行安全漏洞,也可以通过网络钓鱼攻击拦截浏览器中的输入。
虽然 AbstractField<T>
有getConvertedValue()
和setConvertedValue(Object value)
,但您可以在Object
中获取/设置值。请注意,在使用之前,您需要设置setConverter(Converter<T,?> converter)
。
这里有一个如何正确使用对话的示例:Creating your own converter for String - MyType conversion
简而言之:
Name
是一个简单的POJO,包含firstName
和lastName
字段及其getter / setter。
转换器类
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)
TextField
PasswordField
答案 1 :(得分:3)
这个派对有点晚了,但是我想把我的2美分加到已讨论的内容上。
它可能纯粹是confort和代码重用,因为PasswordField
只是在BE端扩展AbstractTextField
,基本上是AbstractField<String>
所以所有的值操作逻辑,事件处理等都是已经在那里了。
否则,可能必须实现AbstractField<char[]>
并从AbstractTextField
复制粘贴几乎所有内容。或者使AbstractTextField
或类似的东西变得一致......
无论哪种方式,如前所述,攻击者都需要访问服务器来转储内存,在这种情况下,您可能会遇到更大的问题,无论是来自组织外部还是内部(当然,有些员工拥有自己的员工)因某些原因造成伤害): - )
关于FE,VPasswordField
对应方创建了an input of type password,并且已经在Paolo Forgia的答案中讨论了有关FE-BE通信的安全问题。
答案 2 :(得分:2)
当vaadin代码在您的Web浏览器中运行时,它不再位于JVM中,因此在这种情况下使用String是正常的。密码将作为Java String存储在服务器端,因此为了访问该密码String,攻击者必须访问您的服务器。
您应该查看在生成的javascript中如何处理该密码字段。