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