2013-04-17 5 views
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

경고 : [SQL 주입] (http://en.wikipedia.org/wiki/SQL_injection)! –

+1

SQL 주입을 막기 위해 PreparedStatement를 사용하여 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

감사합니다. 나는 보안에 대해 걱정하기 전에 실제로 더 잘 이해하기 위해 연습하고 있습니다. 내 질문은 ...이게 작동합니까 :'(rs.next() && rs.getString (1) == passWord)'? – dinky

+1

@Dinky ==를 사용하여 String을 비교하면 안되고, equals를 사용해야합니다. 이 경우 비어 있지 않은 결과는 암호가 일치 함을 의미하므로 비교가 필요하지 않습니다. – Drogba

+1

@Dinky 위의 귀하의 의견을 단지 연습을위한 것으로 보았지만 비밀번호 보안은 간과되어 종종 반복 할 가치가있었습니다. 비교를하려면 USERNAME 대신 쿼리에서 PASSWORD를 반환하고 쿼리에서 암호 비교를 제거한 다음 if 문을 업데이트해야한다고 말하면됩니다. 내가 위에서 언급했던 것에 따라 나는 그것을하는 것을 찬성 할 것이다. –

관련 문제