2016-11-25 13 views
0

우리는 현재 GUI를 통해 원하는 결과를 제한 할 수 있도록 사용자가 간단한 select 문에 where 절을 정의 할 수 있도록하는 기능을 개발 중입니다.Java : 사용자가 where 절을 제공합니다. SQL injection을 방지하는 방법은 무엇입니까?

테이블 이름은 다를 수 있지만 그 외에도 "select * from TABLE_NAME"입니다 (나는 끔찍한 생각이지만 고객이 왕이라는 것을 알고 있습니다). SQL 인젝션에 무한한 가능성을 제공하기 때문에 필자는 최후에 가장 널리 사용되는 SQL 인젝션 기법을 방지하기 위해 실행 가능한 접근법을 찾고 있었고 많은 정보를 찾을 수 없었습니다. 대부분의 팁은 사용자가 PreparedStatements를 통해 해결할 수있는 쿼리 매개 변수만을 제공한다는 가정에 기반합니다. 하지만 제 경우에는 그들은 거의 쓸모가 없습니다.

나는 두 가지 접근법을 생각하고 있는데, 아마도 최선의 효과를 위해 결합 할 것입니다. 그러나 주사를 예방하는 방법이 더 많지 않고 정확하게 실현하지 못한다면 어떨까요? 오픈 소스 도구 나 프레임 워크가 존재합니다.) 나는 사용자 입력이 널리 사용되는 SQL 주입 기술을 기반으로 포함 할 수 없습니다 어떤 텍스트와

  1. 정의를 분석 생각합니다.
  2. 사용자 입력 내용을 정의하십시오.

1. 나는 여러 가지 SQL 주입 사례를 검사하는 방법을 포함하는 유틸리티 클래스를 작성한다고 생각합니다. 정규식을 사용하여 패턴을 인식 할 수 있습니다.

2. 정규 표현식 또는 XText 프레임 워크를 사용하여 DSL을 정의하는 것으로 생각되므로 정의 된 규칙과 일치 할 때만 사용자 입력이 허용됩니다. 또한 현재 TABLE_NAME에 실제로 있는지 확인하기 위해 열 이름을 추출 할 수도 있습니다. 그러나이 경우 검색어에 대해 특정 종류의 제한 만 허용해야합니다 (예 : rownum < = 100은 작동하지 않거나 특별한 처리가 필요함).

앞서 언급했듯이이 주제에 대한 정보가 많지 않으므로 나에게 더 나은 기술, 도구 또는 접근 방식을 추천 해 주시면 매우 감사하겠습니다.

미리 감사드립니다.

+0

기본적으로 포인트 2 : 이미 존재하는 SQL 문법 (일부는 antlr을 사용합니다)을 사용하여 일부 구문 분석기 생성기를 사용하여 유효성을 검사하고 쿼리를 생성합니다. –

+0

기존 도구가 있습니다. Querydsl이 당신이 원하는대로 할 수 있을까요? – chrylis

답변

3

당신은 당신이 할 수있는 SQL 주입 응용 프로그램을

두 가지를 구축 : 데이터베이스 사용자가 할 수있는 쿼리의

  1. 제한 유형. 예를 들어, 업데이트 권한을 부여하지 마십시오.

  2. where 절을 몇 가지 간단한 조건 (예 :a 절은 t.col = value와 일치해야합니다. 그런 다음 간단한 파서를 사용하여 모든 입력을 규칙과 비교하십시오.

몇 가지 주입 기술이 있으며 모든 것을 얻을 수 있습니다.

+0

롤 (Lol), 그것이 내가 요구 사항을 들었을 때 내가 생각한 것입니다. 이 유형의 텍스트 분석을 위해 간단한 파서를 추천 할 수 있습니까? 답변 주셔서 감사합니다! –

+0

죄송합니다, 한 손으로는 잘 모르겠지만, 정규 표현식을 사용하여 1 시간 정도면 쓸 수 있다고 생각합니다. t.col = number 또는 t.col = 'string'같은 절이 AND로 결합되어 있는지 확인하십시오. 문자열을 글자, 숫자, 공백 및 몇 개의 다른 문자로 제한하십시오. 또한 삭제, 삭제, 삽입 등의 권한이있는 사용자가 쿼리를 실행하지 않도록하십시오. – OneSolitaryNoob

+1

많은 도움을 주셨습니다. 감사합니다! 나는 당신의 답변에 표를 던졌지 만 더 많은 점수를 얻었을 때 계산에 포함됩니다. 또한 이미 시스템 설계자와 이야기를했고 제안 된 옵션 중 하나를 선택했습니다 :) –

0

나는 텍스트 필드 대신 바닐라 SQL 대신 그래픽 쿼리 빌더 UI를 고려할 것이다.

  • 는 예를 들어, Java를 할 경우, 그냥 다음 critera objects for Hibernate Criteria queries에 매핑되는 등 큰 일 (속성과 이것 저것을 가진 영리한 상자) 그래픽 표현을 만들 수 없습니다.
  • 고객은 SQL 쿼리에서 도움말 + 전문 지식이 필요한 일반 텍스트 필드보다 그래픽 쿼리 작성자에 대해 더 감사 할 수 있습니다.
+0

이것이 올바른 방법입니다. 고객이 설계 변경이나 간단한 SQL 제한에 대한 제한 사항을 수락하면 다음 주에 시스템 설계자와 이야기 할 것입니다. 좋은 점은 최종 사용자가 기능을 볼 수 없으며 고객의 관리자 만 볼 수 있다는 것입니다. –