2017-09-07 8 views
0

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インジェクションを可能にする簡単な方法はありますか?

具体的には、セミコロンを渡すことができないようにしたいと考えています。

答えて

3

文字列を使用します私はホワイトリストの代わりに、正規表現を示唆して

DROP your_package_name 
+0

は、それはあなたが何を意味を理解するためにOP(または未来の読者を)助けるかもしれませんこの。 "SQLインジェクションは必ずしもセミコロンで何かを意味するものではありません。例えば、......" – mathguy

+0

これは非常にうまくいきますが、この場合は害はありません。DROP package_name.map_productsこれは無効な文である。 –

2

DRDROPOP your_package_name 

置き換えるのは一度だけであなたを残しDROPに置き換えられます。

入力をシステムテーブルと照合します。

select object_name 
from dba_objects 
where owner = 'SYS' 
and object_type = 'PACKAGE' 
and object_name = :p_string; 

一致するものが見つからない場合は、既知のパッケージではないので、使用しないでください。

0

私は削除すると思います。 SQLインジェクションを避けるための第1のアプローチになります。正規表現と

  1. エキスの有効なパッケージ(例えば、あなたは英数字を持っていることを確認し、または「_」入力、またはパッケージ名で使用できる他の文字から名前が、何も:しかし、この可能な戦略を考えてみてください。 else)。
  2. 前の手順の出力を使用して、パッケージが実際にデータベース内のオブジェクトである(user_objectを照会している)ことを確認します。
  3. この時点で、有効なパッケージ名(存在する場合)があり、動的ステートメントでそれを使用できます。

すでにあなたのアプローチは危険であると言いました。あなたの正規表現の単語(salaryUPDATErなど)を含む名前のパッケージでは問題があることに気付いただけです。

0

上記の他の投稿はブラックリストに載っていますバイパスするのがかなり簡単になるでしょう。

ホワイトリストの検証を使用することは常に理想的です。それが実現できない場合、そしてこれがOracleであるため、dbms_assert.enquote_nameを組み込むことをお勧めします。これは値を安全にenquotesし(埋め込み引用符をチェックします)。

DBMS_ASSERT詳細を参照してください: https://oracle-base.com/articles/10g/dbms_assert_10gR2#ENQUOTE_NAME

または予防上の深さでより多くのためのSQLインジェクションは、以下を参照してください。 http://www.oracle.com/technetwork/database/features/plsql/overview/how-to-write-injection-proof-plsql-1-129572.pdf

関連する問題