0

如何检查用户名和密码(在登录页面中作为输入)是否匹配?所有信息都存储在 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();
    }
}
4

1 回答 1

3

存储未加密的密码的安全性很差,使用Bcrypt之类的东西加密会好得多。

像下面这样的东西应该可以满足你的需要。使用 aPreparedStatement是至关重要的,不应该使用简单的字符串连接,因为它允许 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();

根据站点的性质,另一个好的做法是在失败时向用户显示相同的通用消息,无论是用户名(或电子邮件地址)还是密码不正确。示例消息是“无效的用户名或密码”。这样做的好处是它有助于防止用户名被收集,因为攻击者无法从错误消息中判断用户名是有效的。对于某些站点,这比其他站点更重要,并且用户名已经公开的站点不会像其他可用的收获方法那样受益。

于 2013-04-17T03:52:57.893 回答