2013-04-17 54 views
0

我如何检查用户名和密码(作为登录页面中的输入)是否匹配?所有信息都存储在Derby数据库中。我只需要知道是否为给出的用户名输入了正确的密码。如何在查询后匹配用户名和密码

这里是我的代码:

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

警告:[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)! –

+1

请使用PreparedStatement构造你的sql来防止sql注入。 – Drogba

+0

您可以简单地比较数据库中的密码。但出于安全目的,您应该散列密码。 – Drogba

回答

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

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

+0

谢谢,埃德。实际上我只是在我担心安全性之前就习惯了更好的理解。我的问题是...这会工作:'if(rs.next()&& rs.getString(1)== passWord)'? – dinky

+1

@Dinky你不应该使用==比较String,使用equals。对于这种情况,您不需要进行任何比较,因为非空结果意味着密码匹配。 – Drogba

+1

@Dinky我在上面看到你的评论只是为了练习,但密码安全性经常被忽略,所以值得重复。要进行你提到的比较,你需要从查询中返回PASSWORD而不是USERNAME,从查询中删除密码比较,并更新if语句。尽管如上所述,我赞成这样做。 –

相关问题