1

もちろん、JDBC/ODBC を使用している場合は、バインド変数と準備済みステートメントを使用して SQL インジェクションを防ぐことができます。しかし、最終的に Oracle SQLPlus を呼び出すバッチ プロセスにデータが渡される場合、SQL インジェクションを防ぐ方法はありますか? 例えば:

クエリ.sql:

select '&1' from dual;
exit;

したがって、SQLPlus からこのスクリプトを呼び出すと、次のようになります。

$ sqlplus SCOTT/TIGER @query.sql "x','y"

次の出力が得られます。

old   1: select '&1' from dual
new   1: select 'x','y' from dual

' '
- -
x y

ご覧のとおり、SQLPlus コマンド ライン パラメータは単純なマクロ置換を使用しています。私が見逃している別の方法はありますか?それ以外の場合、これが悪用されるのを防ぐにはどうすればよいですか?

4

5 に答える 5

5

人々があなたのデータベースへの sql*plus アクセス権を持っていて、あなたが特権ユーザーのユーザー ID とパスワードをスクリプトで読み取れるようにしている場合、とにかく彼らにズボンを落としたことになります。SQL インジェクションの心配はほとんどありません。

于 2009-02-24T02:51:22.153 に答える
4

コマンド ラインを介して SQL*Plus を介してパラメータを渡すと、コマンド ラインが最初に OS を介して解釈されるため、SQL インジェクション以上の可能性が開かれます。そのため、OS ユーザーができることも考慮する必要があります。

個人的には、SQL*Plus はやめて、Perl のようなものを使用します。SQL ステートメントをラップするための適切なプログラミング言語があり、変数と例外の処理がはるかに優れています。

于 2009-02-23T22:03:17.090 に答える
0

代わりにバインド変数を使用することをお勧めします。スクリプトでは、次のことができる必要があります。

variable my_var varchar2(100);
begin
:my_var := &1;
end;
/
select :my_var from dual;

「my_var」変数はクエリにバインドされます。単純な検索/置換の代わりに。

于 2009-02-23T20:28:02.980 に答える
-1

SQL*Plus スクリプトをインターネット上の悪意のある見知らぬ人にさらさない限り、SQL インジェクション攻撃を受けることはありません。実際にあなたの会社を攻撃する人々。

社内で実行されるバッチ ジョブについて話しているようです。完全にファイアウォールの背後にあり、残りのネットワーク ユーザーはあなたの同僚ですよね?

彼らが真剣に狂ったソシオパスでない限り、「攻撃」には何の意味もありません。実際に発生した SQL インジェクションの問題は、本当にひどく悪い設計であるか、終了の理由でした。これは、人々のアクセスと、利用可能なツールを使用するスキルの通常の管理にすぎません。


編集

「制御文字による破損」が何を意味するのかを知っているふりをすることはできませんが、追加のアドバイスを提供できます。

SQL インジェクションを介して実行時に破損を引き起こすプログラミング上の問題があると疑われる場合は、テスト環境が必要です。

本番スキーマを複製して、テスト スキーマを作成します。データの既知のサブセットをロードします。テスト スキーマで SQL スクリプトを実行します。SQL スクリプトに「何らかの方法で」「制御文字」を入れた場合、これを示すテスト スクリプトが作成されます。

于 2009-02-23T20:23:58.997 に答える
-2

次の SQL Plus コマンドを使用できます。

SET DEFINE OFF
于 2009-10-27T10:18:21.757 に答える