2015-01-28 2 views
1

내 API의 사용자 이름과 비밀번호를 인증하기 위해이 쿼리를 작성하려고하지만 오류 열을 찾을 수 없습니다. 사용자 이름과 암호 모두 문자열이며 MYSQL 데이터베이스를 사용하고 있습니다. 나는 사용자 이름과 암호가 문자열이기 때문에 인용문에 오류가 있다고 생각합니다. 아래의 코드를 어떻게 수정할 수 있습니까? 아니면 같은 코드를 작성하는 더 좋은 방법이 있습니까? P.S - 봄용 MVC를 사용하고 있으며 이것은 첫 번째 프로젝트입니다.JDBC 템플릿 쿼리의 오류

@Override 
    public TypeInfo getRole(final TypeInfo typeinfo) { 

      String sql = 
      "select Role from registartion where UserName=\"" + typeinfo.getUserName() + "and Password=\"" + typeinfo.getPassword() + "/""; 
      return jdbcTemplate.query(sql, new ResultSetExtractor<TypeInfo>() { 

       @Override 
       public TypeInfo extractData(ResultSet rs) 
         throws SQLException, DataAccessException { 
        if (rs.next()) { 
         System.out.println("VALID USER"); 
         TypeInfo typeinfo1 = new TypeInfo(); 
         typeinfo1.setUserName(typeinfo.getUserName()); 
         typeinfo1.setPassword(typeinfo.getPassword()); 
         typeinfo1.setRole(rs.getString("Role")); 
         return typeinfo1; 
        } 
        System.out.println("Not A valid user"); 
        return null; 
       } 

      }); 
     } 

"사용자 이름이 ****** 인 registartion에서 역할 선택"이라는 오류가 발생합니다. ******* 찾을 수 없습니다.

+0

아마도 테이블 이름은 '등록'이 아니고 '등록'입니까? –

+0

SQL 문자열 리터럴은 ** single ** 따옴표로 구분됩니다. 큰 따옴표는 객체 이름을 인용하는 데 사용됩니다. 그래서 본질적으로 사용자 이름 = ""; 그 열은 존재하지 않습니다. 또한 매개 변수와 함께 PreparedStatement를 사용하고 사용자가 제공 한 값을 쿼리 문자열로 연결하지 마십시오. –

답변

0

인용구를 엉망으로 만들거나 보안을 강화하지 않으려면 적절한 해결책은 PreparedStatement을 사용하는 것입니다.

당신이 정말로 문자열 concatination의 말씀을 구성해야하는 경우, 당신은 SQL에서 해당 문자열 리터럴을주의해야한다은 작은 따옴표 ('),하지 따옴표 (")로 표시됩니다 방법이 아니다

String sql = 
"select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + '"; 
1

당신은 당신의 질문을 써야합니다.

JdbcTemplateObject[] 배열을 매개 변수로 사용하여 SQL 주입을 방지합니다. 이것의 라인 어딘가에

코드를 :

String user = "yourUser"; 
    String password = "yourPassword"; 
    final String sql = "SELECT * from FOO where username = ? and password = ?"; 
    Object[] sqlParameters = new Object[]{user, password}; 

    List<YourEntityClass> list = getJdbcTemplate.query(sql, new BeanPropertyRowMapper<Your Entity Class>(YourEntityClass.class), sqlParameters); 

BeanPropertyRowMapper 실제로 당신을 위해 값을 매핑합니다. 단지

대한 추가 정보를 원하시면 여기 데이터베이스에 엔티티 클래스는 것과 동일한 속성 이름이 있는지 확인 : jdbcTemplate examples

0

이보십시오.

String sql = "select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + "'"; 
0
  1. 변경 따옴표로 (이스케이프 문자 포함) 따옴표.

  2. 사용자 이름 (typeinfo.getUserName())을 묶는 작은 따옴표를 닫습니다. 닫는 작은 따옴표와 후속 문자열 사이에는 공백을 유지해야합니다.

그래도 작동하지 않으면 테이블 이름과 열 이름을 확인하십시오. 아마도 그것은 '등록'이지 '등록'이 아닌 것입니까? 또는 'username'이 아닌 'user_name'일 수 있습니까? 초보자를위한 팁 : SQL 문자열을 데이터베이스 브라우저에 붙여넣고 변수를 실제 값으로 대체하고 실행합니다. 오류가 있는지 확인하십시오. 이런 식으로 오류를 수정하는 것이 더 쉽습니다.

그리고 마지막으로 sql injection을 피하기 위해 매개 변수화 된 sql 쿼리를 사용하십시오. 제 생각에는 매개 변수화 된 쿼리는 구문 오류를 줄입니다.