2013-02-14 4 views
3

java를 처음 사용합니다. FileChooser에서 선택한 파일 경로를 데이터베이스에 삽입하려고합니다. 하지만 그렇게하려고 할 때 경로는 쿼리 문까지 올 바르고 데이터베이스에 입력 한 후 파일 경로에있는 모든 백 슬래시를 제거합니다. 내 선택 파일 경로가파일 경로를 데이터베이스에 삽입하면

filepath=f.getCanonicalPath(); 
// some database statements.... 
String query="insert into table1 values('" + filepath + "')"; 

경우 :

"C : \ 사용자 \ 문서 \ hello.txt";

그것은으로 삽입합니다 :

"C : Usersdocumentshello.txt"

+1

더 많은 코드를 표시 할 수 있습니까? 'StringEscapeUtils.escapeSql' 또는 적절한 준비/바인딩/실행 자바 코드를 사용하면 문제가 해결 될 것이라고 생각합니다. – Najzero

+1

@Najzero : 매개 변수화 된 SQL을 적절히 사용하는 경우 * 이스케이프 * 할 필요가 없습니다. –

+1

@JonSkeet thats correct. 또는 또는 쿼리 바인딩/매개 변수화가 선호되는 방식으로 수정되었습니다. 바비 테이블 참조가 누락되었습니다. – Najzero

답변

9

기본적으로, 당신이 그와 같은 SQL에 직접 값을 넣어해서는 안된다.

PreparedStatement을 사용하고 매개 변수를으로 설정해야합니다. 이스케이프가 필요하지 않으며 SQL 주입 공격의 위험이 없습니다.

String query = "insert into table1 values(?)"; 

PreparedStatement statement = connection.prepareStatement(query); 
try { 
    statement.setString(1, filePath); 
    statement.executeUpdate(); 
} finally { 
    statement.close(); 
} 

동적으로 사용자 입력을 기반으로 SQL을 구축하는 자신을 발견 모든 시간, 당신은 다시 걸음을해야하고 강하게 대신 매개 변수화 된 SQL을 고려하십시오. (예외적으로 앱이 기본적으로 SQL 개발 도구 인 경우 ...)

+0

Jon Skeet 나는 java를 사용하고있다. PreparedStatement는 java.sql 패키지 아래에있다. – sincerekamal

+1

@ user2057804 :'java.sql' 패키지는 MySQL 드라이버가 지원할 공통 JDBC 인터페이스이다. MySQL의 사용은 PreparedStatement를 사용하지 않는 이유가 아닙니다. –

+0

답장을 보내 주셔서 감사합니다. 마침내 도움이 된 ** StringEscapeUtils **에 대해 알게 해 주신 [Najzero] (http://stackoverflow.com/users/1563305/najzero)에게 감사드립니다. :) – sincerekamal

관련 문제