0

ユーザー名とパスワードが GUI で作成され、MySQL テーブルに保存される Java GUI の登録およびログイン ページを作成しています。関連するコードは -

    passL = new JPasswordField();
    userNameT = new JTextField();

    //Set up everything else


    submitB = new JButton("click to submit");
    frame.add(submitB);
    submitB.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = GetConnection.getConnectionInstance();
                PreparedStatement statement1 = con
                        .prepareStatement("INSERT INTO users (username, password) VALUES ("
                                + Integer.parseInt(userNameT.getText())
                                + ",SHA1('" + passT.getPassword() + "'))");
                statement1.executeUpdate();
            } //Catches exceptions etc

userNameT は数字で、パスワード (passT) は何でもかまいません (まだ制約を書いていません)。

私の質問は、Eclipse が getPassword に関する警告を表示していることです。「char[] を明示的に文字列に変換する必要があります」。これを行う方法にセキュリティ上の問題はありますか?

また、これをコピーした直後に passT を null または空白に明示的に変更する必要がありますか、それとも Java が自動的に変更しますか。

すべてのアドバイスを歓迎します! ありがとう

4

2 に答える 2

0

を使用するポイントの 1 つは、SQL インジェクションPreparedStatementから保護することですが、その使用方法では依然として脆弱なままです。代わりに、Java でのハッシュを検討し、次のようなパラメーター値を設定する必要があります。

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setInt(1, Integer.parseInt(userNameT.getText()));
stmt.setString(2, DigestUtils.sha1Hex(String.valueOf(userPassT.getPassword())));
于 2013-06-09T21:03:55.220 に答える
0

問題は型の不一致です。「getPassword 」は、クエリで連結される文字列に変換する必要があるchar[]を返します。

オブジェクトが使用されなくなったら、Java がガベージ コレクションを処理します。つまり、どこからも参照されなくなるので、心配する必要はありません。

おそらく、「 getPassword 」によって返された配列をクリアすることが唯一のセキュリティ上の予防措置です。

于 2013-06-09T20:58:41.887 に答える