2011-11-24 3 views
0

두 개의 STRING 인수 인 Java 메소드 인 다음 부분을 작성하고 사용자의 로그인 이름과 암호를 나타내는 pass를 사용하여 사용자가 데이터베이스 테이블에서 발견되었는지 여부를 확인합니다.JDBC ResultSet SQL 오류

Statement stmt = connection.createStatement(); 

ResultSet rs = statement.executeQuery ("SELECT * FROM users WHERE username = '" 
     + login + "' AND passwd = '" + pass + "'"); 

테스트 코드가 올바르게 작동합니다. 나는 그것이 잠재적으로 SQL 오류를 생성 할 수있는 상황이 있지만 위의 코드가 SQL 오류를 일으킬 수있는 상황을 정확히 언급하지 않는다는 것을 책에서 읽었습니다. 이런 상황을 간단히 비켜 주시겠습니까? 또한 이러한 오류가 발생할 가능성을 방지하는 코드 버전을 작성하려면 어떻게해야합니까?

답변

0

첫 번째 문제는 코드의 조각에 SQL Injection vulenrable 때문이다. 당신이 Prepared Statements을 사용할 수 있다고 열렬히 말하십시오. 이 책은이 책이 잠재적으로 위협하는 하나의 위협 일 수 있습니다. 준비된 문 당신은 코드가 prevent SQL 주입을 작성해야한다

String query = "SELECT * FROM users WHERE username = ? AND passwd = ?"; 

PreparedStatement ps = connection.prepareStatement(query); 

ps.setString(1, login); 
ps.setString(2, passwd); 

Resultset rs = rs = ps.executeQuery(); 
+1

= "사용자 이름 '; 데이터베이스를 제거, 커밋"; '문자열 로그인 BorisPavlović 좋은 무서운 예를 –

+0

:하지만 데이터베이스에 많이 의존한다. Boris의 공격은 오라클이나 PostgreSQL에서 하나의'executeQuery()'호출에서 다중 명령문을 허용하지 않기 때문에 작동하지 않습니다. SQL Server와 MySQL은 특정 공격에 대해 배제 할 수 있습니다. – Zohaib

+2

@Zohaib @' –