2010-12-02 5 views
31

나는 취약한 SQL 쿼리를 읽고 응용 프로그램에 주입하려고 시도했습니다. 그것은 충분히 안전하지 않습니다. 데이터베이스 유효성 검사 및 기타 삽입 작업을 위해 Statement Connection을 사용하고 있습니다.preparedStatement가 SQL 삽입을 피합니까?

preparedStatements는 안전한가요? 또한이 진술에 어떤 문제가있을 것인가?

+1

준비된 문이 갈 수있는 방법입니다. AFAIK 준비된 문장은 한 번만 구문 분석되므로 나중에 SQL 주입 가능성은 없습니다. 물론 XSS 공격 등으로부터 보호하려면 입력을 sanitse해야합니다. – CurtainDog

답변

47

임의의 입력에서 쿼리를 생성하기 위해 문자열 연결을 사용하면 PreparedStatement이 안전하지 않습니다. 이 예를 살펴 :

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';"; 

을 누군가가 userName

' or '1'='1 

을두고 경우 PreparedStatement 해당 쿼리가

SELECT * FROM users WHERE name = '' OR '1'='1'; 
로 데이터베이스에서 실행되기 때문에, SQL 인젝션에 취약 할 것

따라서 사용하는 경우

당신은 안전 할 것입니다.

이 코드 중 일부는 this Wikipedia article에서 가져 왔습니다.

+3

setString은 어떤 차이가 있습니까? 실제로 무엇을합니까? 심지어 문자열을 대체합니다. 그것이 다른 점은 무엇입니까? –

+10

@ 모하메드 : 차이가 있습니다. 질의''SELECT * FROM users WHERE name =? ''은 컴파일 된 데이터베이스로 보내지고'setString'의'userName'은 대체 될 것입니다. 데이터베이스에 잘못된 값이 있으면 오류가 발생합니다. 따라서 '또는'1 '='1'은 연산자'또는'및'= '가 포함 된 명령문이 아니라 전체 문자열로 취급됩니다. 데이터베이스는이를 "" '또는'1 '='1 ''값을 가진 문자열로 보게됩니다. – darioo

2

준비된 문을 올바르게 사용하면 SQL 주입을 방지 할 수 있습니다. 그러나 질문에 코드 예제를 게시하여 올바르게 사용하고 있는지 확인할 수 있습니다.

1

글쎄 단순히 PreparedStatement을 사용해도 안전하지 않습니다. 으로 가능한 SQL 쿼리의 매개 변수를 사용해야합니다. 자세한 내용은 here을 참조하십시오.

1

this article에서 설명한 것처럼 PreparedStatement만으로도 문자열을 연결하는 경우 도움이되지 않습니다. 예를 들어

, 하나의 악의적 인 공격자는 여전히 다음을 수행 할 수 있습니다

  • 전화 절전 기능 모든 데이터베이스 연결이 때문에 DB에서 민감한 데이터를 추출
  • 사용할 수없는 응용 프로그램을 만드는 바쁜 될 수 있도록
  • bypassing the user authentication

는 그리고 영향을 B 수 있습니다 단지 SQL 아니다. 바인드 매개 변수를 사용하지 않는 경우 JPQL조차도 손상 될 수 있습니다.

결론 SQL 문을 작성할 때 문자열 연결을 사용하지 마십시오. 그 목적을 위해 전용 API를 사용

관련 문제