2012-10-21 2 views
0

자바 저장 프로 자바의 PreparedStatement와 MySQL을 사용 있나요?이 가능한 SQL 삽입은 일상

+0

기본적으로 아니요. 그러나 저장 프로 시저가 동적 SQL 문을 작성하여 실행하면 가능한 SQL 주입으로 바뀔 수 있습니다. –

+0

이 쿼리는'SELECT * FROM userTable WHERE userName =? '이라고 가정 해 보겠습니다. 만약 당신이'preparedStatement'를 사용하고 있다면, 컴파일 된 곳으로 직접 보내지고'setString()'메쏘드의'userName'이 대체 될 것입니다. 부정한 값을 발견하면 (자), 예외가 Throw됩니다. ' '또는'1 '='1'과 같은'userName'은 전체 문자열로 취급되며'or' 및'='와 같은 연산자를 포함하지 않습니다. 따라서 안전합니다. – Lion

답변

2

아니요, PreparedStatementSQL Injection으로부터 보호해야합니다.

저장 프로 시저를 호출하는 것이므로 CallableStatement을 사용하는 것이 좋습니다. PreparedStatement로의

String SQL = "{CALL myStoredRoutine(?, ?, ?)}"; 
CallableStatement cstmt = myConnection.prepareCall(SQL); 
  • 준비된 문

인스턴스는 이미 컴파일 된 SQL 문이 포함되어 있습니다. 이것은 "준비된"문장을 작성하는 것입니다.

PreparedStatement 오브젝트는 프리 컴파일되어 있기 (위해) 때문에, 그 실행은 Statement 오브젝트의 실행보다 빠르다 준비된 문은 SQL을 실행하는 데 사용됩니다

CallableStatement 오브젝트는 모든 RDBMS에 대해 표준의 방법으로 스토어드 프로 시저를 호출 할 수있는 방법을 제공합니다

  • 호출 가능 문을 쿼리합니다. 저장 프로시 저는 데이터베이스에 저장됩니다. 스토어드 프로 시저의 호출은 CallableStatement 오브젝트에 포함됩니다.

1

아니요, 불가능합니다. 문자열은 준비된 문으로 필터링 된입니다. 사실 그 점 중 하나입니다.

0

아니요. 매개 변수 바인딩의 목적은 매개 변수가 매개 변수로 구문 분석된다는 것입니다. 성능면에서도 뛰어납니다.

0

매개 변수화 된 쿼리를 사용하면 필요에 따라 인수가 구문 분석되고 이스케이프 문자로 변환되므로 불가능합니다. 이것이 매개 변수화 된 질의/준비 문을 사용하는 이점입니다.