繁体   English   中英

为什么PasswordField在Vaadin中使用String而不是char []?

[英]Why PasswordField use String instead of char[] in Vaadin?

字符串容易受到密码值的影响。 我注意到,Vaadin PasswordField操纵密码作为一个String

以下是PasswordField默认构造函数,

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

我的问题:

  • 在Vaadin中使用PasswordField是否安全?
  • 什么内部API可以确保密码的安全性?

TL; DR Vaadin PasswordField是一个简单的TextField 输入隐藏在客户端,服务器端以明文形式传输。

虽然您可以使用getConvertedValue()setConvertedValue(Object value)来获取/设置您自己类型中的值。 请注意,您必须在使用之前设置setConverter(Converter<T,?> converter)

这里有一个如何正确使用对话的示例: 为String创建自己的转换器 - MyType转换


完整解释

Vaadin TextFieldPasswordFieldTextArea都是AbstractField<String>子代。

Vaadin Docs TextField

详细地:

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 DocsPasswordField部分中明确说明:

您应该注意, PasswordField 仅通过“肩膀”视觉观察隐藏输入。 除非使用安全连接(例如HTTPS)对服务器连接进行加密,否则输入将以明文形式传输,并且可能会被对网络进行低级访问的任何人拦截。 此外,通过利用浏览器中的JavaScript执行安全漏洞,可以拦截拦截浏览器中输入的网络钓鱼攻击。


尽管 AbstractField<T>具有getConvertedValue()setConvertedValue(Object value) ,它们允许获取/设置您喜欢的Object的值。 请注意,在使用之前,您需要设置setConverter(Converter<T,?> converter)

这里有一个如何正确使用对话的示例: 为String创建自己的转换器 - MyType转换

简而言之,这个例子:

Name是一个带有firstNamelastName字段及其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();
    }

}));

完整来源

这个派对有点晚了,但我想把我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM