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これは無効な文である。 –