Oracle
當輸入包含“刪除”、“插入”、“更新”等關鍵字時,在儲存過程中引發應用程序錯誤
我有一個儲存過程,它獲取 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;