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 주입을 피할 수있는 쉬운 방법이 있습니까?
더 구체적으로 말하면, 우리는 세미콜론을 전달할 수 없도록하고 싶습니다.
그것은 당신이 무슨 뜻인지 이해하기 위해 OP (또는 미래의 독자들에게) 도움이 될 수 있습니다 이. "SQL 삽입은 반드시 세미콜론으로 뭔가를 의미하는 것은 아닙니다. 예를 들어, ......" – mathguy
그러나이 경우 매우 좋지만 아무런 해가 없으므로 다음과 같은 결과가 발생합니다. DROP package_name.map_products 잘못된 진술에 있습니다. –