如何检查用户名和密码(在登录页面中作为输入)是否匹配?所有信息都存储在Derby DB中。我只需要知道是否为给定的用户名输入了正确的密码。
这是我的代码:
public void checkIdPw(String userName, String passWord) {
try {
stmt = conn.createStatement();
String checkPwforIdSQL = "SELECT PASSWORD FROM " + studentsTable + " WHERE USERNAME = '" + userName + "'";
stmt.executeQuery(checkPwforIdSQL);
stmt.close();
} catch(SQLException sqlExcept) {
sqlExcept.printStackTrace();
}
}
答案 0 :(得分:3)
存储未加密密码的安全性较差,使用Bcrypt等加密密码会更好。
以下内容应该适合您的需要。使用PreparedStatement
是至关重要的,不应该进行简单的字符串连接,因为它允许SQL注入攻击。
PreparedStatement stmt = conn.prepareStatement(
"SELECT USERNAME FROM studentsTable WHERE USERNAME = ? AND PASSWORD = ?");
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
// valid credentials
} else {
// invalid credentials
}
rs.close();
stmt.close();
根据站点的性质,另一个好的做法是在失败时向用户显示相同的通用消息,无论是用户名(或电子邮件地址)还是密码不正确。示例消息是“用户名或密码无效”。这样做的好处是它有助于防止用户名收集,因为攻击者无法从错误消息中判断用户名是否有效。对于某些网站而言,这比其他网站更重要,而且用户名已经公开的网站不会像其他收获方法那样受益。