2009-12-11 2 views
3

유효한 SQL 문자열이있는 경우; 어쨌든 나는 그것을 PL/SQL에서 실행할 수있다. 그러나 그것이 SELECT 문일 뿐이라는 것을 보장한다. 복잡한 구문 분석을하지 않고도 이스케이프 문자/중첩 명령이나 그 재즈가없는 것을 보장하지 않는다.Oracle (PL/SQL)에서 동적 SQL 실행 및 보안 보장

편집 :

내가 정말 달성하기 위해 노력하고있어 일반, 내장 내 응용 프로그램, 쿼리 도구입니다. 도메인 친화적 인 GUI가있어서 비 기술 사용자가 합리적으로 복잡한 쿼리를 작성할 수 있습니다. 이 툴은 검색의 버전 관리를 처리하고 필요한 경우 내부 조인을 추가하며 일반적인 SQL DEV 유형 도구를 찾을 수없는 일부 애플리케이션 관련 정보를 추가합니다.

응용 프로그램이 SQL 쿼리를 성공적으로 만듭니다. 문제는 사용자가 자신의 SQL을 직접 입력하도록 허용한다는 것입니다. 잠재적 SQL 주입 유형 문제가 걱정됩니다.

이것이 적절한 장소인지 확실하지 않습니다. 하지만이 질문에 덧붙여서 - 누군가가이 오라클의 책을 추천 할 수 있다면이 성질의 것들을 빠르게 할 수있을 것입니다. 정말 고맙겠습니다.

+0

왜 그렇게 자발적으로 필요한 것이 있습니까? 유스 케이스의 범위를 인젝션 세이프 인 매개 변수만을 사용하는 것으로 좁힐 수 있습니까? –

답변

6

한 가지 해결책은 사용자에게 GRANT 사용자에게만 부여하는 것입니다 (사용자에게 SELECT 권한이있는 경우).

페이지의 "Oracle Database Security Guide: Introduction to Privileges"

그러나, 나는 당신이 SELECT에 쿼리를 제한하기 때문에 응용 프로그램이 반드시 단지 확보하고 있다고 생각하지 않습니다. SELECT 검색어의 안전하지 않은 사용을 허용 할 때 발생할 수있는 장난의 예가 있습니다.


당신의 명확한 질문을 다시 : 나는 SQL 주입을 공부하고 꽤 그것에 대해 작성했습니다. 일반적인 규칙으로 조언 할 수있는 것은 다음과 같습니다. 사용자 입력을 코드로 실행하지 마십시오. 이것이 바로 SQL 주입이 일어나는 방법입니다.

도메인 특정 언어를 디자인하고 사용자 입력을 SQL 조작에 맵핑 할 수 있지만 사용자 선택 사항을 데이터베이스 스키마로 변환하는 계층이 있는지 확인하십시오. 매핑 레이어를 도입하여 SQL 코드에서 사용자 입력을 분리하면 괜찮을 것입니다.

또한 답변 : "How do I protect this function from sql injection"을 참조하십시오.

1

oracle에서는 첫 번째 단어가 "select"또는 "with"인지 확인할 수 있습니다. 이것은 PL/SQL의 Ada 유산으로 인해 복합 문이 시작/끝 블록에 있어야하므로 일반적인 SQL 삽입 기법으로 인해 구문 오류가 발생합니다.

물론 가장 좋은 대답은 사용 권한을 부여하고 가능하지 않은 경우 알 수없는 입력을 직접 평가하는 것입니다. 그러나 begin/end 구문이 많은 SQL 주입 공격 벡터를 제거한다는 것은 흥미 롭습니다.

+1

그러나 모든 select 문이 'select'라는 단어로 시작하는 것은 아닙니다. 일부는 'WITH'로 시작합니다. –

1

사용자가 텍스트 영역을 제공하여 원하는대로 입력 할 수 있다면, 원하는대로 SQL 삽입을 할 수 있습니다.

그런 식으로 문을 열어 두지는 않겠지 만, 내가 강제로해야한다면, 사용자가 원하는대로 설명 계획을 실행합니다.옵티마이 저는 쿼리를 구문 분석하고 SQL 문에 대한 모든 정보를 plan_table 테이블에 저장 한 다음 실제로 select 연산인지 확인하고, where 절이 액세스되는 스키마/테이블의 인덱스를 확인합니다. 데카르트 조인 또는 전체 테이블 스캔과 같은 "나쁜"조작이있는 경우 사용자가 승인 한 것입니다.

+0

제안 해 주셔서 감사합니다. 아이디어는 선택 가능한 액세스 권한이있는보기에서만 SELECT 할 수 있다는 것입니다. 나는 방금 넓은 보안 구멍을 남길 것이라고 걱정하고 있습니다. 나는 이번 주말에 독서를해야한다고 생각한다. ( –

3

오라클은 public에게 많은 실행 권한을 부여합니다. 따라서 명시 적 삽입/업데이트/삭제/실행 권한이없는 사용자조차도 장난을 할 수 있습니다.

장난이라고하면 SELECT를 사용하더라도 문제가 발생할 수 있습니다. "SELECT * FROM 테이블 FOR UPDATE 컬럼"은 전체 테이블을 잠글 것입니다. SELECT ... FOR UPDATE는 SELECT 권한 만 필요합니다.

멍청한 쿼리 (예 : 직교 조인)는 데이터베이스를 필요로 할 수 있습니다 (Resource Manager는 지정된 IO 또는 CPU보다 적은 양의 쿼리 만 허용하여 대부분을 차단할 수 있어야하지만).

승인 된 SQL 목록을 제공하고 포함시킬 SQL을 지명하는 프로세스는 어떻습니까?

1

writing injection proof pl/sql에 대한 오라클의 보고서를 살펴보십시오. DBMS_ASSERT 내장 패키지는 SQL에 적합성을 테스트하는 데 도움이됩니다.

이러한 테스트를하더라도 사람들에게 공개 네트워크 나 모든 사람을 알지 못하는 대규모 조직에서 쿼리를 작성하기위한 공개 텍스트 창을 제공하는 것을 매우 꺼립니다. 그런 기회를 찾고있는 매우 창조적 인 사람들이 있습니다.