2013-07-17 19 views
6

Tôi đang sử dụng JPasswordField trong chương trình của mình. Khi tôi yêu cầu getPassword(), tôi nhận được một mảng char[]. Nhưng khi tôi thêm một số ActionListener vào số JPasswordField và yêu cầu getActionCommand(), tôi nhận được mật khẩu là String. Mật khẩu này có lưu trong đối tượng sự kiện là String không? Đây có phải là vấn đề bảo mật không?Bảo mật JPasswordField với lệnh hành động

+3

Sử dụng chuỗi là vấn đề bảo mật. Vui lòng đọc http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords (câu trả lời từ Jon Skeet) để biết chi tiết. –

+3

+1 bắt tốt, nghe như một lỗi đối với tôi! Cách ra là để luôn luôn đặt actionCommand vì vậy nó không dự phòng để mặc định – kleopatra

+2

+1 cho một tìm kiếm tuyệt vời :-) Bây giờ bạn sẽ báo cáo điều này để 'Java Oracle' hay không? –

Trả lời

3

Khi bạn không đặt lệnh hành động cho thành phần, văn bản trong đó sẽ là lệnh hành động. Đây là lý do tại sao bạn nhận được mật khẩu.

Ngay cả đối với JTextField cũng

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

Đây là một vấn đề an ninh vì bạn đang nhận được mật khẩu như String đó là bất biến chứ không phải là một char[]

Bất cứ khi nào một lệnh hành động rõ ràng không được thiết lập, các văn bản trong thành phần sẽ được gửi đến hàm tạo ActionEvent mặc dù bạn không đặt nó làm lệnh hành động. Tuy nhiên, thông số command có thể là null nhưng không được đề xuất là null, do đó văn bản trong thành phần là lệnh hành động theo mặc định. Nếu không có mật khẩu trong JPasswordField một chuỗi rỗng sẽ là lệnh hành động.

Không thử đặt lệnh tác vụ thành null, nếu là null, thì văn bản trong JPasswordField sẽ là lệnh hành động. Vấn đề lại xuất hiện.

Vì vậy, tôi khuyên bạn nên đặt một số lệnh hành động cho JPasswordField mà không cần rời khỏi nó như thế cho đến bây giờ cho đến khi điều này được sửa chữa bởi Oracle.

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

Thx cho câu trả lời. Điều này là tốt để biết. – Yggdrasil