그것은 동적으로 문자열을 실행할 수있을만큼 쉽게 ...
create or replace function fmt_fname (p_dyn_string in varchar2)
return varchar2
is
return_value varchar2(128);
begin
execute immediate 'select '||p_dyn_string||' from dual'
into return_value;
return return_value;
end fmt_fname;
/
당신의 문자열이 무시 무시한 따옴표, 리터럴을 포함하는 경우 문제가 발생 ...
SQL> select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
2/
select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
*
ERROR at line 1:
ORA-00907: missing right parenthesis
SQL>
그래서 우리는 탈출해야 아포스트로피, 게시 된 문자열에 포함되지 않은 것을 포함하여 모두 포함 :
SQL> select * from t34
2/
ID FILENAME
---------- ------------------------------
1 APC001
2 XYZ213
3 TEST147
SQL> select * from t34
2 where filename = fmt_fname('''TEST''||to_char(sysdate, ''DDD'')')
3/
ID FILENAME
---------- ------------------------------
3 TEST147
SQL>
편집 그냥 내가 토니의 솔루션은 단지뿐만 아니라 작동한다는 점을 지적한다고 생각 공정성을 위해서
:
SQL> create or replace function fmt_fname (p_dyn_string in varchar2)
2 return varchar2
3 is
4 return_value varchar2(128);
5 begin
6 execute immediate 'begin :result := ' || p_dyn_string || '; end;'
7 using out return_value;
8 return return_value;
9 end;
10/
Function created.
SQL> select fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') from dual
2/
FMT_FNAME('''TEST''||TO_CHAR(SYSDATE,''DDD'')')
--------------------------------------------------------------------------------
TEST147
SQL>
사실, DUAL에 SELECT를 피함으로써 아마 더 좋다.
출처
2010-05-27 12:01:43
APC
SQL을 통해 유효성이 검증되지 않은 사용자 입력을 실행하면 SQL 주입 공격이 발생할 수 있습니다. SELECT를 사용하면 함수가 수행 할 수있는 작업을 제한하기 때문에 최소한 보호 기능을 제공합니다. PL/SQL 주입을 허용하면 모든 종류의 불쾌 함이 발생할 수 있습니다. –