動的クエリで ddl ステートメントを実行する必要がある場合など、バインド変数を使用できない状況では、次の防御策のリストで十分ですか?
動的クエリで無名ブロックを使用しないでください。これにより、execute immediately で実行できるステートメントは 1 つだけになります。これにより、コード インジェクション攻撃が阻止されます。
replace 関数を使用してすべての一重引用符をエスケープします。これにより、ステートメント変更攻撃が阻止されます。
一重引用符以外に引用に使用できる文字と、それらをエスケープする方法を教えてください。
AND、UNIONなどの攻撃によるステートメントの変更を防ぐ方法は?
ユーザーが組み込み関数を呼び出せないように関数呼び出し攻撃を防ぐ方法は? すべてのユーザーはこれらの関数を呼び出す権利を持っており、これらの関数を呼び出すと、サービス拒否やバッファ オーバー フロー攻撃が発生する可能性があります。そこからどうやって救う?
GUI が一重引用符を使用できるようにすることは、Web アプリケーションのクライアント側とサーバー側の検証でそれをチェックしないことを意味します。これは、O'Brian のような名前を許可するためです。データベース レベルでは、execute immediate ステートメントの直前で一重引用符をエスケープします。より良いアプローチを知っていますか?
上記に記載されていないその他の脆弱性に対する解決策。
注: このサイトでは、SQL インジェクションに関連する約 10 の質問に既に回答しています。私はまだこの質問を投稿しました:
それはオラクルに固有です。このトピックに関するこのサイトで見つけたほとんどの質問は、MySQL、SQL サーバーなどに関連しています。
これは、バインド変数を使用できない状況に固有のものです。バインド変数を使用できる場合は、それで十分であり、他の防御は必要ありません。
必要なすべてのメソッドを 1 か所にリストすることをお勧めします。
関数呼び出しのような SQL インジェクションのいくつかの高度な手法については詳しく説明されておらず、それに対する解決策を見つけることができません。
編集:
以下は実行可能な解決策かもしれません。
解決策があると思います。静的ステートメント、バインド変数などの通常の防御を使用することに加えて、通常の防御を使用できない状況で特に役立ちます。バインド変数を使用できない唯一の状況は、ddl ステートメントであることに注意してください。そのようなステートメントの場合:
静的 SQL を使用してデータベース オブジェクトの存在を確認します。これで問題の半分は解決します。
残りの半分は、データベース オブジェクトに入れたい新しい値に関連しています。たとえば、ユーザーのパスワードを変更する場合: 前半はユーザー名、後半はパスワードです。フロントエンドで新しい値を暗号化し、暗号化された値をデータベースに保存する必要があります。SQL コードとして暗号化された暗号化された値は、データベースに損害を与えることはできません (たとえば、関数を呼び出すことはできません)。
パスワードなどでユーザーを混乱させるなど、さまざまな理由でユーザー入力を変更しないでください。値は、有効な html などの状況で有効な場合があります。これは、[']、[\']、[# ] すべての検証を変更せずに通過します。それを処理するのは静的 SQL または暗号化です。
新しい値を暗号化できない状況はありますか?