1

Selenium Webdriver を使用して Web サイトをテストするためのスタンドアロン アプリケーションを開発しています。アプリケーションは、JavaFX (Swing) UI を使用して、ユーザーがテスト スイート ファイルをロードし、実行するテストと実行するブラウザーを選択できるようにします。UI は、ユーザー名などのテストで使用されるデータもキャプチャします。パスワード。

JUnitCore を使用して選択したテスト クラスを実行する予定ですが、UI からテスト クラスにデータを渡す必要があります。ほとんどのデータについては、System.setProperty(prop, value) を使用してこれを行うことができます。ただし、Web サイトの管理者パスワードやその他のパスワードもテストに渡す必要があります。

パスワードをテストに渡す最良の方法は何ですか?

System.setProperty を使用してパスワードを保存する場合のセキュリティ上の懸念は何ですか? 代わりに、データを暗号化してファイルに保存し、テストでファイルを読み取ってデータを復号化する必要がありますか? これにより、各テストのセットアップに必要な処理量が明らかに増加します。

4

1 に答える 1

0
  • UI を実行するユーザーがパスワードを知っている場合、セキュリティ上の懸念はありません。あなたは誰から守っていますか?
  • UI を実行するユーザーがパスワードを知らない場合 (そして、パスワードはテストケース自体に保存する必要があります)、あなたは窮地に陥っています - 暗号化は良いことですが、何らかの方法で復号化するためにパスワードを保存する必要があります ...終わりのない円、安全な場所はありません。保存が安全であっても、弱点は間違いなくブラウザーへの転送 (何があっても JSON にカプセル化されたプレーン文字列として行われます) と、ブラウザー自体への自動入力です。真剣に、テストが実行されるマシンを信頼しない場合は、パスワードを保存しないでください。

ただし、最初のケース (ユーザーが UI にパスワードを入力する必要がある場合) では、脅威の可能性を最小限に抑え、利便性を最大限に高めるために、次のようにします。

  1. シングルトンクラスを作成するPasswordHolder
  2. aまたはでパスワード (によって与えられた)PasswordHolderを記憶します。ここで、キーはパスワード識別子であり、値はパスワード自体です。JPasswordFieldMap<String, char[]>Map<String, Password>
  3. getPassword()パスワードがメソッドを介してアクセスされると、その内容は無効になります

簡単なサンプル実装 (重要なものを含めることを忘れないことを願っているので、さらなる改善のために... しかし、それは起こる可能性があります)。私はそれがちょっとそれ自体を物語っていると思います:

public class PasswordHolder {

    private static PasswordHolder instance = null; 
    private final Map<String, Password> map = new HashMap<String, Password>();

    private PasswordHolder() {
        // nothing to do
    }

    public static PasswordHolder getInstance() {
        if (instance == null) {
            instance = new PasswordHolder();
        }
        return instance;
    }

    public void addPassword(String name, char[] pass) {
        if (map.containsKey(name)) {
            // throw some sort of Exception("Duplicate password name, man.")
        }
        map.put(name, new Password(pass));
    }

    public Password getPassword(String name) {
        return map.get(name);
    }

}

最も便利なこととして、私は と書いPasswordCharSequenceので、 で便利ですsendKeys(CharSequence keys)。残念ながら、sendKeys()は を使用toString()するため、とにかくパスワードから String を作成する必要があります (これは悪い習慣と見なされます)。

public class Password implements CharSequence {

    private final char[] pass;
    private final BitSet nulled;

    Password(char[] pass) {
        this.pass = pass;
        nulled = new BitSet(pass.length);
    }

    private void nullify(int start, int end) {
        for (int i = start; i < end; i++) {
            pass[i] = '\0';
        }
        nulled.set(start, end);
    }

    @Override
    public int length() {
        return pass.length;
    }

    @Override
    public char charAt(int index) {
        if (nulled.get(index)) {
            // throw some Exception("That character has already been read!")
        }
        char ret = pass[index];
        pass[index] = '\0';
        nulled.set(index);
        return ret;
    }

    @Override
    public CharSequence subSequence(int start, int end) {
        if (nulled.get(start, end).cardinality() > 0) {
            // throw some Exception("Some of the characters has already been read!")
        }
        Password subPass = new Password(Arrays.copyOfRange(pass, start, end)); 
        nullify(start, end);
        return subPass;
    }

    @Override
    public String toString() {
        if (nulled.cardinality() > 0) {
            // throw some Exception("Some of the characters has already been read!")
        }
        String str = new String(pass);
        nullify(0, pass.length);
        return str;
    }

}
于 2012-05-31T11:58:59.337 に答える