2016-08-11 2 views
6

文字列はで、パスワード値はです。私は、Vaadin PasswordFieldパスワードStringとして操作していることに気づいた。続きなぜVaadinでPasswordFieldがchar []の代わりにStringを使用するのですか?

PasswordField

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

のデフォルトコンストラクタ私の質問です:

  • はVaadinでPasswordFieldを使用することが安全ですか?
  • どの内部APIがを保証するのですか?パスワードの安全性はありますか?
+1

文字列を使用するのがどのように脆弱であるかわかりません。文字列は他のJavaフレームワークでも使用されます。また、正規表現を使ってパスワードのパターンを設定することもできます。 – cdaiga

+5

@cdaiga [これを参照](http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-for-passwords-in-java)なぜ 'char []'が'String'よりも安全です –

答えて

6

TL; DR Vaadin PasswordFieldは単純TextFieldです。入力はクライアント側で隠され、サーバー側ではクリアテキストで送信されます。

自分のタイプの値を取得/設定するのに、getConvertedValue()setConvertedValue(Object value)を使用できますが、使用する前にsetConverter(Converter<T,?> converter)を設定する必要があることに注意してください。

ここでは、適切に会話を使用する方法の例があります。Creating your own converter for String - MyType conversion


十分な説明

Vaadin TextFieldPasswordFieldTextAreaはすべてAbstractField<String>の子です。具体的には

Vaadin Docs TextField

:、その両親のString

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

PasswordField作品は、それ以外の場合はAbstractField<char[]>を実装している必要があります。 PasswordField section from Vaadin Docsでさらに

は、明示的に述べている:

あなたはPasswordFieldのみ目視「肩越し」からの入力を隠していることに注意してください。サーバー接続がHTTPSなどのセキュアな接続で暗号化されていない場合、の入力はクリアテキストで送信され、ネットワークへの低レベルのアクセス権を持つユーザーは傍受される可能性があります。また、ブラウザのJavaScript実行セキュリティホールを利用することで、ブラウザの入力を傍受するフィッシング攻撃も可能です。


AbstractField<T>ありgetConvertedValue()および取得できるようにsetConvertedValue(Object value)が/ Objectお好みで値を設定します。使用する前にsetConverter(Converter<T,?> converter)を設定する必要があることに注意してください。例から要するにCreating your own converter for String - MyType conversion

NamefirstNamelastNameフィールドとそのゲッター/セッターを持つ単純なPOJOある

ここでは、適切に会話を使用する方法の例を持っています。

Converterクラス

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

ウェブブラウザでvaadinコードが実行されても、それはJVMには存在しないため、この場合は文字列を使用しても問題ありません。パスワードはサーバー側にJava Stringとして格納されるため、パスワード文字列にアクセスするには攻撃者がサーバーにアクセスする必要があります。

パスワードフィールドが生成されたjavascriptでどのように処理されるかを確認する必要があります。

3

、私はすでに議論されているものに私の2セントを追加したいと思います。 PasswordFieldちょうどなど、イベント処理、基本的にAbstractField<String>ので、すべての値の操作ロジックであるBE側AbstractTextFieldを拡張既に存在するよう

それは、純粋な快適さとコードの再利用であってもよいです。

そうでなければ、おそらくAbstractField<char[]>を実装して、これのためにちょうどAbstractTextFieldからすべてをコピーして貼り付ける必要があります。またはAbstractTextFieldまたは類似のものを生成する...

いずれにしても、既に述べたように、攻撃者はメモリをダンプするためにサーバーにアクセスする必要があります。大きな問題があるかもしれませんが、組織の外からでも内部でもかまいません

FEについては、VPasswordFieldan input of type passwordを作成し、FE-BE通信に関するセキュリティ上の懸念はすでにPaolo Forgiaの答えで議論されています。

関連する問題