2013-07-17 12 views
6

Sto utilizzando un JPasswordField nel mio programma. Quando chiedo getPassword(), ottengo un array char[]. Ma quando aggiungo uno ActionListener allo JPasswordField e chiedo allo getActionCommand(), ottengo la password come String. Questa password è salvata nell'oggetto evento come String? Non si tratta di un problema di sicurezza?Sicurezza JPasswordField con comando di azione

+3

L'utilizzo di una stringa è un problema di sicurezza. Si prega di leggere http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords (la risposta di Jon Skeet) per i dettagli. –

+3

+1 buona presa, suona come un insetto per me! La via d'uscita è impostare sempre l'actionCommand in modo tale che non ricolleghi al valore predefinito – kleopatra

+2

+1 per una grande scoperta :-) Ora hai intenzione di segnalarlo a 'Java Oracle' o no? –

risposta

3

Quando non si imposta alcun comando di azione per un componente, il testo al suo interno sarà il comando di azione. Ecco perché stai ottenendo la password.

Anche per JTextField anche

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

Questo è un problema di sicurezza perché si stanno ottenendo password come stringa che è immutabile, piuttosto che un char[]

Ogni volta che un comando di azione esplicita non è impostata, il testo il componente verrà inviato al costruttore ActionEvent anche se non è stato impostato in modo specifico come comando di azione. Il parametro command può essere null, ma non è consigliabile che sia null, pertanto il testo nel componente è il comando di azione per impostazione predefinita. Se non ci sono password nel JPasswordField una stringa vuota sarà il comando di azione.

senza impostare alcun comando di azione per null, se è null, allora il testo nella JPasswordField sarà il comando di azione. Il problema viene di nuovo.

Quindi vorrei raccomandare di impostare un comando di azione per il JPasswordField senza lasciarlo così per ora fino a quando questo non viene corretto da Oracle.

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

Thx per la risposta. Questo è buono a sapersi. – Yggdrasil