查询后如何匹配用户名和密码

时间:2013-04-17 03:22:34

标签: java sql authentication

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

1 个答案:

答案 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();

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