我在NetBeans IDE 8.2上设计了 ForgotMyPassword.java jFrame表单 其中我使用phpMyAdmin从中获取注册用户的电子邮件地址,并使用JavaMail通过MYSQL数据库将其发送到他们的电子邮件地址
我基本上想从中获取注册用户的电子邮件地址,并使用JavaMail作为一次性密码(OTP)恢复选项通过MYSQL数据库将其发送到他们的电子邮件地址
这是源代码:
String username = usrnmfield.getText();
String email = emailID.getText();
String[] to = {"emailaddr@gmail.com"};
Connection conn=null;
PreparedStatement pstn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection db = DriverManager.getConnection("jdbc:mysql://localhost:3307/app" , "xxxx" , "xxxx");
pstn=db.prepareStatement("select * from register where USERNAME=? and EMAIL=?");
pstn.setString(1,username);
pstn.setString(2,email);
ResultSet i=pstn.executeQuery();
if(i.next())
{
if(JavaMail.send
("abc@gmail.com",
"xxxx",
to,
"Hello world",
"Thank you for reading my post"))
{
JOptionPane.showMessageDialog(null , " Please Check out your Inbox for any Password sent by us to you ");
}
}
else if (usrnmfield != i && emailID != i)
{
JOptionPane.showMessageDialog(null, "Wrong Username or E-Mail ID");
}
} catch(HeadlessException | ClassNotFoundException | SQLException e) {
JOptionPane.showMessageDialog(null, e);
}
}
答案 0 :(得分:0)
可能会有所帮助的一些评论和调整:
关于您的应用程序设计,您应该强烈考虑其他架构。我们不建议让客户端(桌面)应用程序直接使用SQL数据库来处理安全问题。在客户端实现整个安全性显然是一个坏主意(并且很容易被绕过),并且它将无法管理。考虑在远程安全服务器上使用集中式安全数据库,该服务器提供最先进的身份验证和授权机制(例如,通过HTTPS上的REST-API)。服务器端安全框架包括Keycloak,SpringSecurity,Apache Shiro,JaaS ......通过搜索Web,您将看到您的设计并不常见。此外,对于OTP,使用Web服务器或简单地进行远程交换似乎是显而易见的(并且您将需要它们)。您还可以考虑通过集中式LDAP服务器实现日志记录。
在select语句中为您的字段命名。例如。 "select password from register where ..."
以便您在使用select *
时知道您的预期或使用字段名称:
ResultSet rs = ...
String myValue = rs.getString(1);
String myValueBis = rs.getString("password");
始终使用try-finally块包围数据库查询,以便关闭ResultSet,准备好的语句以及最终的连接(如果没有重复使用),最好按此顺序关闭。
我没有看到这个条件的目的:
else if (usrnmfield != i && emailID != i) { ...
您正在将文本字段与ResultSet进行比较,但文本中包含的值和ResultSet的当前行的值(参见1)都没有。这毫无意义。
如果您希望允许用户根据其用户名或电子邮件检索其密码,则应考虑在SQL语句中使用“OR”(而不是“and”)。
使用JavaMail时,您必须确保Session包含足够的信息来发送电子邮件。这通常是任何JavaMail应用程序中创建javax.mail.Session
对象的第一步。因此,您需要配置smtp服务器或中继,最终配置端口和身份验证。由于您没有显示JavaMail类的代码,我建议您将其放在原始问题中,如果您有任何问题并澄清问题是什么(如果有的话)。
一般来说,如果您考虑将此应用程序用于商业用途或某些严重用途,您还应该快速考虑以加密方式存储密码(例如,作为SHA-256)。并且还考虑不通过电子邮件发送密码(如果您只存储用户密码的哈希值,它会很自然地出现......)而是建议他们以一种安全的方式重置/更新它。
我认为您应该使用更多代码更新您的问题(更多最终确定和更清洁)并更准确地解决您的问题。主持人将你的问题标记为“一般”或模糊不清,我不会感到惊讶。