Oracle

當輸入包含“刪除”、“插入”、“更新”等關鍵字時,在儲存過程中引發應用程序錯誤

  • July 19, 2020

我有一個儲存過程,它獲取 6 個輸入查詢,輸入與where clause查詢相同。例如where x=1 and z=5 and e=4. 應用程序生成這些輸入字元串並將其傳遞給我的程序。這是我的程序的一部分,我在其中檢查輸入以驗證每個輸入查詢的內容,以便它們不包含像“select”這樣的關鍵字, “更新”、“刪除”或等價物。我想知道是否有更好的方法來做到這一點。

create or replace procedure app_error_test(query1 nvarchar2,
                                          query2 nvarchar2,
                                          query3 nvarchar2,
                                          query4 nvarchar2,
                                          query5 nvarchar2,
                                          query6 nvarchar2) is
queryconcat nvarchar2(30000);
begin

--**************** validate content of input queries

queryconcat := lower(nvl(query1, '') || nvl(query2, '') ||
                    nvl(query3, '') || nvl(query4, '') ||
                    nvl(query5, '') || nvl(query6, ''));

if (queryconcat like '%drop%' or 
     queryconcat like '%delete%' or
      queryconcat like '%execute%' or 
       queryconcat like '%truncate%' or
        queryconcat like '%create%'  or 
         queryconcat like '%update%'  or
          queryconcat like '%insert%') then

    RAISE_APPLICATION_ERROR(-20032, 'ILLEGAL CONTENT');
 end if;
end;

提前致謝

我會使用regex_like

select column_value
    , case
          when regexp_like(' '||column_value||' ','\s(drop|execute|truncate|create|insert|update|delete|merge)\s', 'i')
              then 'Yes'
      end as illegal
from   table(ora_mining_varchar2_nt
            ('drop table customers', 'just dropping by', 'undroppable'));
COLUMN_VALUE              ILLEGAL
------------------------- -------
drop table customers      Yes
just dropping by          
undroppable               

我已經添加merge到列表中,因為我假設您正在嘗試防止 SQL 注入。如果是這樣,即使您過濾關鍵字,仍然存在風險。execute但是,它不是 SQL 關鍵字。你的意思是call

您的程序將變為:

create or replace procedure app_error_test
   ( query1 nvarchar2
   , query2 nvarchar2
   , query3 nvarchar2
   , query4 nvarchar2
   , query5 nvarchar2
   , query6 nvarchar2 )
as
   queryconcat nvarchar2(30000) :=
       query1||' '||query2||' '||query3||' '||query4||' '||query5||' '||query6;
begin
   if regexp_like(' ' || queryconcat || ' ', '\s(drop|call|truncate|create|insert|update|delete|merge)\s', 'i')
   then
       raise_application_error(-20032, 'Illegal content in supplied SQL: '||queryconcat);
   end if;
end;

引用自:https://dba.stackexchange.com/questions/271207