2009-08-18 5 views
2

저는 JDBC를 처음 사용하기 때문에 새로운 프로젝트에서 JDBC를 사용해야합니다. 내가 알고 싶은 것은JDBC가 안전합니까?

은 JDBC가 안전한가요?

"MySQL 삽입"과 같은 문제를 방지하는 방법은 무엇입니까?

JDBC를 사용할 때주의해야 할 보안 문제는 무엇입니까?

그리고 어떻게 해커가 데이터베이스를 해킹하지 못하도록 보안을 최적화해야합니까?

편집 :

내가 구글 만약 내가 구글을 시도 :

내가 구글 경우 =>이 결과

를 많이 제공

"PHP는 MySQL의 보안 문제" :

"JDBC mysql 보안 문제 "=> 관련된 페이지가 거의 보이지 않는다.

jdbc를 사용하면 안전합니까? 해킹에 대해 걱정할 필요가 없습니까?

+3

누구나 "x is secure"라는 질문을하면 코드에 보안 취약성이 존재할 가능성이 높습니다. 보안은 사실보다는 프로세스에 가깝기 때문입니다. 코드/도구/사이트는 안전하지 않습니다. 그것들은 실행되고 안전한 방법으로 사용되며 알려진 취약점이있을 수 있습니다. 사람들이 묻는 질문에 X가 안전하다고 대답하면 대답이 "예"이면 더 이상 보안에 대해 생각할 필요가 없다고 생각하는 경향이 있습니다. 그리고 그 사고는 취약점으로 이어집니다. – Yishai

답변

11

prepared statements을 사용하십시오. 가상 로그인의 경우 다음과 같이 사용하십시오.

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM member WHERE member_username = ? AND member_password = ?"); 
stmt.setString(1, username); 
stmt.setString(2, password); 
stmt.execute(); 

ResultSet rs = stmt.getResultSet(); 
// ... 

이렇게하면 SQL 주입 취약점으로부터 완전히 보호됩니다.

+1

감사합니다. 이것은 현재 코드에서 가지고있는 것입니다. 나는 준비된 진술을 의미합니다. 지금은 안심입니다 :) –

+0

이것은 PHP/MySQL뿐만 아니라 다른 모든 현대/웹 프로그래밍 언어에서도 작동합니다. –

+0

그리고 비보안 버전은 무엇입니까? – ZeroCool

5

JDBC는 데이터베이스 연결 프로토콜이므로 다른 모든 데이터베이스 연결 방법과 마찬가지로 안전합니다.

대부분의 보안 문제는 JDBC 프로토콜 자체와 관련이 없습니다. 예를 들어 Prepared Statement를 사용하여 SQL 주입의 위험을 최소화 할 수 있습니다. 이는 데이터베이스에 연결하는 방법에 관계없이 적용됩니다.

+0

큰 설명. 고마워. 고마워. –

2

JDBC는 순수하게 프로그램과 데이터베이스 간의 전송입니다.

사인 온 프로토콜이 네트워크 스니핑에 취약하지 않은만큼 합리적으로 안전하며 네트워크 트래픽에 어떤 것도 주입하는 것은 매우 어렵습니다.

그러나 JDBC는 SQL을 데이터베이스로 전송하고 결과 데이터 집합을 반환합니다. 프로그램이 SQL 인젝션에 유창 할 경우 직접 연결, ODBC 또는 JDBC를 사용하든 취약합니다.

실제로 SQL 주입으로부터 자신을 보호하는 유일한 방법은 "?"과 함께 준비된 문을 사용하는 것입니다. 사용자 입력을위한 자리 표시자를 입력합니다. 안전하지 않은 입력 (직접 입력과 사용자가 입력 한 테이블의 데이터 모두 포함)을 사용하여 SQL 문을 함께 입력하지 마십시오.

10

은 JDBC 보안입니까?

JDBC 보안은 사용하는 JDBC 드라이버의 속성입니다. 일반적으로 드라이버가 SSL 전송 계층을 사용하는 경우 SSL 키의 강도만큼 안전합니다. 암호화되지 않은 전송을 사용하는 경우 보안되지 않습니다.

"MySQL 삽입"과 같은 문제를 방지하는 방법은 무엇입니까?

JDBC에 대한 SQL 쿼리를 작성할 때 포함 된 SQL이 포함될 수있는 '원시'문자열을 포함하지 않도록주의하십시오. 예를 들어 :

someString 당신은 SQL 리터럴 문자열을 할 의도가 무엇 이스케이프 " '"문자가 포함 된 경우
String query = "SELECT * FROM SOME_TABLE WHERE X = '" + someString + "' ;"; 

실제로 완전히 다른 무언가로 변경 될 수 있습니다. 해결 방법은 " '"문자 (또는 다른 nasties)가 포함되어 있으면 someString을 거부하거나 SQL 문자열 이스케이프를 삽입하는 방법으로 사전 처리하는 것입니다.

또 다른 (더 간단하고 안정적인) 접근법은 "?"와 함께 준비된 문을 사용하는 것입니다. 자리 표시자를 사용하여 쿼리에 값을 삽입하십시오.

JDBC를 사용할 때주의해야 할 보안 문제는 무엇입니까?

위와 별개로, JDBC와 관련된 구체적인 사항은 알지 못합니다. 실제로 위의 두 가지 문제는 JDBC에만 해당되지 않습니다.

그리고 어떻게 해커가 데이터베이스를 해킹하지 못하도록 보안을 최적화해야합니까?

  1. 매수/보안 시스템을 구축에 좋은 책을 읽었다.
  2. 주의하십시오.
  3. 코드/시스템을 감사하는 보안 전문가에게 비용을 지불하십시오.
2

또는 유틸리티 메서드 "org.apache.commons.lang.StringEscapeUtils.escapeSql(java.lang.String str)"을 사용하여 SQL 삽입을 방지 할 수 있습니다.

문자열 위생은 항상 SQL 삽입 또는 교차 사이트 스크립팅 공격을 방지하는 가장 좋은 정책입니다.

+2

FWIW, StringEscapeUtils는 더 이상 escapeSql 메서드를 포함하지 않습니다. http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –

0

DB acceess api에 무엇인가를 보내기 전에 특정 정규식 규칙과 일치하는 필드 유효성 검사기를 항상 사용하십시오.

관련 문제