2017-09-07 5 views
0

map_products 프로 시저가 포함 된 수천 개의 Oracle 패키지가 있습니다.regexp_replace를 사용하여 SQL 삽입 방지

우리는 고객이 map_products가 실행되기를 바라는 오라클 패키지 목록을 저장합니다.

들이 이런 동적 SQL을 사용하여 실행하는 방법 :

select sanitize(package_name) 
    into v_package_name 
from custom_plugins 
where id = p_id; 

execute immediate ' 
     begin 
      '||v_package_name||'.map_products; 
     end; 
    '; 

위에 살균 기능 SQL 주입을 방지하는 것을 의미한다.

function sanitize(p_string in varchar2) return varchar2 
is 
begin 
    return regexp_replace(upper(p_string), 
       '(ALTER|MERGE|CREATE|SELECT|INSERT|UPDATE|DELETE|MODIFY|DROP|ENABLE|DISABLE|;)'); 
end; 

이제 우리는이 장기적으로 위험한 방법입니다 실현하고 전체 프로세스를 다시 실행 계획 : 여기

함수의 정의입니다. 그러나 당분간이 regexp_replace가 SQL 주입을 피할 수있는 쉬운 방법이 있습니까?

더 구체적으로 말하면, 우리는 세미콜론을 전달할 수 없도록하고 싶습니다.

답변

3

사용 캐릭터 :

DRDROPOP your_package_name 

가 유일한 당신을 떠나 한 번 DROP를 대체 할 대체 :

DROP your_package_name 
+0

그것은 당신이 무슨 뜻인지 이해하기 위해 OP (또는 미래의 독자들에게) 도움이 될 수 있습니다 이. "SQL 삽입은 반드시 세미콜론으로 뭔가를 의미하는 것은 아닙니다. 예를 들어, ......" – mathguy

+0

그러나이 경우 매우 좋지만 아무런 해가 없으므로 다음과 같은 결과가 발생합니다. DROP package_name.map_products 잘못된 진술에 있습니다. –

2

나는 화이트리스트 대신 정규 표현식을 제안한다.

입력을 시스템 테이블과 대조하십시오.

select object_name 
from dba_objects 
where owner = 'SYS' 
and object_type = 'PACKAGE' 
and object_name = :p_string; 

일치하는 항목을 찾을 수없는 경우 알려진 패키지가 아니므로 사용하지 마십시오.

0

나는 생각합니다. SQL 주입을 피하는 첫 번째 방법이 될 것입니다. "_"는 영숫자 문자, 또는 것을 확인, 예를 들어, 입력에서 정규 표현식 유효한 패키지 이름을 (와

  1. 추출, 또는 다른 어떤 문자는 패키지 이름하지만 아무것도 허용 :하지만이 가능한 전략을 고려하시기 바랍니다 그밖에).
  2. 이전 단계의 결과를 사용하여 패키지가 실제로 데이터베이스의 객체인지 확인합니다 (user_object 쿼리).
  3. 이 시점에서 올바른 패키지 이름 (있는 경우)을 갖게되며 동적 명령문에 사용할 수 있습니다.

귀하의 접근 방법은 위험하다고 이미 말씀하셨습니다. 난 그냥 당신이 regexp (salaryUPDATEr, 예를 들어)에있는 단어 중 하나를 포함하는 패키지와 함께 문제가 될 거라는 것을 알고 싶어요

0

위의 다른 포스터는 블랙리스트에 댓글을 달았습니다 우회하는 것은 아주 쉬울 것입니다.

화이트리스트 검증을 사용하는 것이 항상 이상적입니다. 이것이 가능하지 않은 경우, 그리고 이것이 오라클이기 때문에 최상의 옵션은 dbms_assert.enquote_name에 내장 된 것을 사용하는 것입니다. 이것은 값을 안전하게 enquotes (포함 된 따옴표를 검사)합니다.

DBMS_ASSERT에 대한 추가 정보를 참조하십시오 : https://oracle-base.com/articles/10g/dbms_assert_10gR2#ENQUOTE_NAME

또는 예방에 깊이 더 이상을 SQL 주입은 다음을 참조하십시오 http://www.oracle.com/technetwork/database/features/plsql/overview/how-to-write-injection-proof-plsql-1-129572.pdf