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
Trả lời
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());
}
});
Thx cho câu trả lời. Điều này là tốt để biết. – Yggdrasil
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. –
+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
+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? –