우리는 현재 GUI를 통해 원하는 결과를 제한 할 수 있도록 사용자가 간단한 select 문에 where 절을 정의 할 수 있도록하는 기능을 개발 중입니다.Java : 사용자가 where 절을 제공합니다. SQL injection을 방지하는 방법은 무엇입니까?
테이블 이름은 다를 수 있지만 그 외에도 "select * from TABLE_NAME"입니다 (나는 끔찍한 생각이지만 고객이 왕이라는 것을 알고 있습니다). SQL 인젝션에 무한한 가능성을 제공하기 때문에 필자는 최후에 가장 널리 사용되는 SQL 인젝션 기법을 방지하기 위해 실행 가능한 접근법을 찾고 있었고 많은 정보를 찾을 수 없었습니다. 대부분의 팁은 사용자가 PreparedStatements를 통해 해결할 수있는 쿼리 매개 변수만을 제공한다는 가정에 기반합니다. 하지만 제 경우에는 그들은 거의 쓸모가 없습니다.
나는 두 가지 접근법을 생각하고 있는데, 아마도 최선의 효과를 위해 결합 할 것입니다. 그러나 주사를 예방하는 방법이 더 많지 않고 정확하게 실현하지 못한다면 어떨까요? 오픈 소스 도구 나 프레임 워크가 존재합니다.) 나는 사용자 입력이 널리 사용되는 SQL 주입 기술을 기반으로 포함 할 수 없습니다 어떤 텍스트와
- 정의를 분석 생각합니다.
- 사용자 입력 내용을 정의하십시오.
1. 나는 여러 가지 SQL 주입 사례를 검사하는 방법을 포함하는 유틸리티 클래스를 작성한다고 생각합니다. 정규식을 사용하여 패턴을 인식 할 수 있습니다.
2. 정규 표현식 또는 XText 프레임 워크를 사용하여 DSL을 정의하는 것으로 생각되므로 정의 된 규칙과 일치 할 때만 사용자 입력이 허용됩니다. 또한 현재 TABLE_NAME에 실제로 있는지 확인하기 위해 열 이름을 추출 할 수도 있습니다. 그러나이 경우 검색어에 대해 특정 종류의 제한 만 허용해야합니다 (예 : rownum < = 100은 작동하지 않거나 특별한 처리가 필요함).
앞서 언급했듯이이 주제에 대한 정보가 많지 않으므로 나에게 더 나은 기술, 도구 또는 접근 방식을 추천 해 주시면 매우 감사하겠습니다.
미리 감사드립니다.
기본적으로 포인트 2 : 이미 존재하는 SQL 문법 (일부는 antlr을 사용합니다)을 사용하여 일부 구문 분석기 생성기를 사용하여 유효성을 검사하고 쿼리를 생성합니다. –
기존 도구가 있습니다. Querydsl이 당신이 원하는대로 할 수 있을까요? – chrylis