2013-07-17 10 views
6

Używam w moim programie JPasswordField. Kiedy pytam getPassword(), otrzymuję tablicę char[]. Ale kiedy dodaję ActionListener do JPasswordField i pytam getActionCommand(), otrzymuję hasło jako String. Czy to hasło jest zapisywane w obiekcie zdarzenia jako String? Czy to nie jest kwestia bezpieczeństwa?Zabezpieczenie JPasswordField z poleceniem akcji

+3

Używanie ciągu znaków jest problemem związanym z bezpieczeństwem. Aby uzyskać szczegółowe informacje, przeczytaj http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string- for-passwords (odpowiedź od Jona Skeeta). –

+3

+1 dobry połów, brzmi jak błąd dla mnie! Wyjście to zawsze ustawiać komendę actionCommand, aby nie powracała do domyślnej wartości – kleopatra

+2

+1 dla wielkiego znaleziska :-) Czy teraz zgłosisz to do 'Java Oracle', czy nie? –

Odpowiedz

3

Po ustawieniu polecenia akcji dla komponentu tekst w nim będzie komendą akcji. Dlatego właśnie otrzymujesz hasło.

Nawet JTextField również

JTextField jt=new JTextField("text"); 
     jt.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
       System.out.println(ae.getActionCommand()); 
      } 
     }); 

Jest to kwestia bezpieczeństwa, ponieważ są coraz hasło jako ciąg, który jest niezmienny, a nie char[]

Gdy polecenie działanie jawne nie jest ustawiony, tekst w komponent zostanie wysłany do konstruktora ActionEvent, ale nie ustawiłeś go specjalnie jako polecenie akcji. Parametr command może być jednak null, ale nie jest zalecane, aby być null, dlatego tekst w komponencie jest domyślnie poleceniem akcji. Jeśli nie ma hasła w JPasswordField, pustym ciągiem będzie polecenie akcji.

Nie próbuj ustawić polecenia akcji na null, jeśli jest to null, wówczas tekst w JPasswordField będzie komendą akcji. Problem pojawia się ponownie.

Polecam Ci ustawić komendę akcji dla JPasswordField bez pozostawiania jej na razie, dopóki nie zostanie to naprawione przez Oracle.

JPasswordField jt=new JPasswordField("text"); 
     jt.setActionCommand(""); 
     jt.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
       System.out.println(ae.getActionCommand()); 
      } 
     }); 
+0

Thx za odpowiedź. Dobrze to wiedzieć. – Yggdrasil

Powiązane problemy