2012-03-28 1 views
0

안녕하세요, MVC의 일부로 간단한 확인 방법을위한 코드를 작성하려고합니다.SQL 쿼리 및 결과 크기에서 결과 크기를 얻는 방법

현재 SQL은 준비된 문으로 작성되지 않으므로 분명히 SQL 주입의 위험이 있으므로 준비된 문으로 SQL을 작성하는 것과 관련하여 도움이 될 것입니다.

사용자 모델에있는 방법입니다.

public boolean getInfo() { 

    try { 
     DBAccess dbAccess = new DBAccess(); 

     String sql = "SELECT username, password FROM owner WHERE username = '" + this.username 
       + "'AND password = '" + this.password + "';"; 

     dbAccess.close();dbAccess.executeQuery(sql); 
     dbAccess.close(); 


     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

나는 SQL 쿼리에 의해 생성 된 결과 집합의 크기를 얻으려면 그것의 크기는 다른 진정한 1 명 복귀 인 경우는 거짓입니다.

게시하려는 MVC의 나머지 부분에 대한 자세한 정보가 필요하면 여기에서 확인하십시오.

답변

1

는 그냥 usernameUNIQUE 제약이 있다고 가정 ResultSet#next()의 결과를 반환합니다. 다음 레코드가 없으면 false을 반환합니다.

구체적인 킥오프 예제입니다. 코드에서 지금까지 보여준 것처럼 잠재적 인 SQL 주입 공격 구멍, 리소스 누출 및 threadsafety 문제를 수정하기 위해 약간 재 작성되었습니다. 또한 변경된 SQL 쿼리는 DB에 저장하기 전에 비밀번호를 MD5 해시로 강제 설정해야합니다 (DB에 비밀번호를 일반 텍스트로 저장하지 않으려는 경우).

public boolean exist(String username, String password) throws SQLException { 
    Connection connection = null; 
    PreparedStatement statement = null; 
    ResultSet resultSet = null; 
    boolean exist = false; 

    try { 
     connection = database.getConnection(); 
     statement = connection.prepareStatement("SELECT id FROM owner WHERE username = ? AND password = MD5(?)"); 
     statement.setString(1, username); 
     statement.setString(2, password); 
     resultSet = statement.executeQuery(); 
     exist = resultSet.next(); 
    } finally { 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} 
     if (statement != null) try { statement.close(); } catch (SQLException ignore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException ignore) {} 
    } 

    return exist; 
} 
+0

답장을 보내 주셔서 감사 합니다만, 결과 세트가 1 또는 0인지를 확인합니다. 결과 집합 크기를 resultSet.next()로 확인합니다. 아니면 서블릿에서이 메소드를 호출하고 if 문을 수행해야합니까? – Jimmy

+0

'ResultSet # next()'는 레코드가 하나도 없으면'false'를 반환합니다. – BalusC

1

사용자 이름과 비밀번호 입력란을 선택하고 개수를 선택하고 해당 값을 참조 할 수 있습니다.

그래서 SQL 쿼리는 다음과 같습니다 숫자가 0보다 큰 경우, 또는 하나의 동일한 경우 일치하는 레코드의 수를 반환

SELECT count(*) FROM owner WHERE username = '" + this.username 
      + "'AND password = '" + this.password + "'; 

,이를 확인합니다.

+0

와우 이것은 내가 생각했던 것보다 훨씬 간단합니다. 하지만 사용자 이름이 필요하지 않은 소유자 (*)로부터 ""수 있습니까? – Jimmy

+0

네, 죄송합니다, "전에 손을 복사하지 않았다. 그래서 SQL 라인이 될 것이다 : String sql ="SELECT count (*) FROM owner WHERE username = ' "+ this.username +"AND password =' ​​"+ 이.암호 + " ';"; –

1

DBAccess 클래스의 세부 정보가 없으면이를 수행하는 방법을 알 수 없습니다. 나는 List를 리턴한다고 추측하고있다. (그러나 그것은 추측이다. 이 경우 목록의 크기를 list.size()을 통해 확인하거나 !list.isEmpty()과 함께 최소 1 개의 결과를 반환했는지 확인할 수 있습니다. 물론 목록이 아닌 경우에는 작동하지 않습니다.

그리고 준비된 문장으로 전환해야합니다. 예를 들어 this SO post을 참조하십시오.

사이드 노트 :이 메소드가 사용자 존재 여부를 나타내는 부울을 반환하는 경우 이라고해서는 안됩니다. userExists()과 같은 것이 더 의미가 있습니다.

0

SQL 삽입 방지에 대한 질문이 있거나 "ORM like"라이브러리를 사용하여 시작하려면 myibatis를 사용하여 준비된 문을 만들 수 있습니다. Myibatis는 비교적 간단한 ORM을 생성 할 수있는 데이터 매퍼입니다. 당신이 더 용감해질수록 당신은 최대 절전 모드 또는 JPA로 이동할 수 있습니다.

http://www.mybatis.org/