2

誰かが登録すると、ユーザー名とパスワードが .txt ファイルに保存されます。以下のコードは、各行を検証して、ユーザー名とパスワードがファイルに存在するかどうかを確認します。

ただし、ランダムなパスワードでユーザー名を取得するため、このように動作させたくありません...登録された各ユーザーのユーザー名とパスワードの両方を確認する必要があります。(私は NetBeans を使用しています)

public boolean isCustomer(){
    boolean isFound = false;
    String record = null;
    FileReader in = null;
    try{
        in = new FileReader ("login.txt");
        BufferedReader bin = new BufferedReader(in);
        record = new String();
        while ((record = bin.readLine()) != null)
        {
            if (NameTextField.getText().contentEquals(record))
                isFound = true;
            if (jPasswordField.getText().contentEquals(record))
                isFound = true;
        }

    bin.close();
    bin = null;
 }catch(IOException ioe){
    NameTextField.setText("IOProblem");
 }   
  return isFound;
}

login.txt は次のようになります (ユーザー名、パスワード、区切り記号として「$$$」)。

Joe

656451asda

$$$

Robert

123456hbb

$$$

Tracey

56464999abc

$$$

Celia

abc1234897

$$$
4

5 に答える 5

1

これ ...

if (NameTextField.getText().contentEquals(record))
    isFound = true;
if (jPasswordField.getText().contentEquals(record))
    isFound = true;

テキストファイルにユーザー名またはパスワードが見つかった場合、true が返されることを意味します。私はあなたがこれをしたくないと確信しています。

必要に応じて設定できる2 つのフラグ (foundUserおよびなど) を使用することをお勧めします。foundPasswordreturn foundUser && foundPassword

フィードバックから更新

ユーザー名/パスワードの値を確認するときは、一致させようとしているパスワードがユーザーと一致していることを確認する必要があります。

if (foundUser && jPasswordField.getText().contentEquals(record)) {
    foundPassword = true;
    break; // No need to compare any more details...
} else {
    foundUser = false;
}
if (NameTextField.getText().contentEquals(record)) {
    foundUser = true;
}

更新しました

JPasswordField#getText補足として、セキュリティ上のリスクがあるため、使用しないでください。それらを比較するにはJPassword#getPassword、使用して使用する必要があります。Arrays.equals(char[], char[])

これは明らかに、テキスト ファイルからデータを読み取る方法にも問題を引き起こします。

(ユーザー名/パスワードをテキスト ファイルに保存することは、おそらくより大きなセキュリティ リスクです:P)

于 2013-01-22T23:50:21.377 に答える
1

他の回答で指摘されているように、考慮すべき多くの問題があります。

  1. プレーンなパスワードを保存しないでください。パスワードからハッシュを計算し、ハッシュを保存します。

  2. 可能であれば、テキスト ファイルの代わりにデータベースを使用する

  3. データベースを使用できない場合は、ユーザー名とパスワードの情報を 1 行のテキストに格納します。以下は、Unix パスワード ファイルで使用されるものと同様の形式です。

    joe:fjckdsoij48738423
    marian:fjccoekrnvn3iernci3en
    mrbean:fjd84jfn4u48fu4nf
    

パスワード (ポイント 1 を考慮したパスワードのハッシュ) を確認する場合は、パスワード ファイルを 1 行ずつ読み取ることができます。ユーザー名とパスワードを見つけるために、最初の「:」文字で行を分割します。ユーザー提供データと比較します。

于 2013-01-26T11:02:38.607 に答える
0

これには実際にデータベースを使用する必要があります。

次善の策は、ファイルをスキャンして、ユーザー名をキーとしてマップを使用することです。ただし、プログラムがクラッシュした場合に備えて、それに応じてファイルを更新する必要があります。

于 2013-01-22T23:49:26.313 に答える
0

ユーザー名とパスワードに同じブール値を使用することはできません。1 つが見つかると true に設定され、もう 1 つが見つかっても問題ありません (これは間違っています。両方が存在する必要があります!)。

私はこのように設定します:

private String getUsername(String filename) {
    // 1. Open up the file.
    // 2. Return the String.
}

private String getPassword(String filename) {
    // Basically the same, but return the password.
}

次に、 isCustomer() でこれを行うことができます:

String username = getUsername(filename);
String password = getPassword(filename);
return (username != null) && (password != null); // makes sure they're both there.

(また、これを暗号化されていないテキスト ファイルに保存するべきではありません。これは非常に悪い考えであり、プログラマーになりたい場合は学ぶ必要があることです。)

于 2013-01-22T23:51:59.767 に答える
-1

ユーザー名とパスワードを同じテキスト行に入れます。

于 2013-01-22T23:49:22.730 に答える