2009-12-07 2 views
1

ComName은 'a'b'c' "def"j Limited입니다.mysql 삽입 및 업데이트 쿼리 (Java)에서 작은 따옴표 및 큰 따옴표

내가 모든 전에 \를 추가하려고 ' "'및하지만 실행되는 결과 쿼리는 내가 내 내 Comname이 표시되지 않는

"UPDATE empTable SET empId= '25', ComName = 'a'b'c'"def"j Limited where ID=1" 

입니다 '와 \는 모든 이전에 존재하지 않는'와 '

여기

는 열 값

columnValue.replaceAll("\'", "\\" + "\'"); 
columnValue.replaceAll("\"", "\\" + "\""); 
columnValue=("'" + columnValue + "'"); 

어떻게 이러한 유형의 문자열을 삽입하기 위해 구성하는 코드이다?

+0

같은 예, *해야 *이 대한의 PreparedStatement를 사용, 다른 모든 단지 SQL 주입 공격을 위해 밖으로 울고있다. 그러나 그로부터 appart, 당신은'replaceAll()'호출이 리턴 값으로 무엇인가를하는 경우에만 유용하다는 것을 기억해야한다. 문자열은 변경되지 않으므로 새 값을 포함하는 새로 반환 된'String'을 무시하면 실제로 그 행에서 아무 것도하지 않았다는 것을 의미합니다. –

+0

나는 여기서 반환 문자열이 중요하다는 것을 잘 알고 있으며 문제는 따옴표로 정확하게 이해하고 있습니다. ( –

답변

1

같은 빠른 수정 아파치 평민 랭 StringEscapeUtils#escapeSql 또는 이에 상응하는 라이브러리를 사용하여 시도 할 수 있습니다와 같은 this one

+0

그레이트 API가 있습니다 !!! –

+0

빠른 수정으로 사용하면 준비된 문이 훨씬 더 우수합니다. – dfa

+0

나는 이해합니다. 아직 마감일인데 프로젝트 단계도 중요한 역할을합니다 :) –

8

JDBC 라이브러리에서 PreparedStatements을 살펴보십시오. 예 : setString() 등을 사용하여

PreparedStatement pstmt = con.prepareStatement("update Orders set pname = ? where Prod_Id = ?"); 
pstmt.setInt(2, 100); 
pstmt.setString(1, "Bob"); 
pstmt.executeUpdate(); 

는 문자열을 인용 할 필요에서 당신을 저장합니다. 그들을 사용하는 방법에 관한 Here's a tutorial.

편집 : Nick이 아래에서 강조했듯이, 이것은 문제를 인용하는 것뿐만 아니라 SQL 주입 (보안) 문제도 줄여줍니다.

+0

+1 - 왜 스스로를 도피하는 것은 단지 버그가 아니라 보안 결함을 가져 오는 지 수백 가지의 기사가 있습니다 –

+0

실시간 문제는 여기 열입니다 이름, 테이블 이름은 모두 동적입니다 : (정확한 열 순서 및 데이터 형식을 찾기가 정말 어려울 것입니다. –

관련 문제