Oracleデータベースを使用するシステムがあります。スキーマはアプリケーション・ユーザーとは異なります。スキーマ名自体はあらかじめわかっていないので、単にハードコードするだけではありません。これはシステムプロパティです。文字列連結を使用しない動的スキーマを使用したクエリ
ほとんどのデータアクセスは接続時にデフォルトのスキーマを指定できるHibernateを介して行われるため、この場合は問題ありません。
ただし、(jdbcTemplateを使用して)プレーンSQLクエリが使用される場所がいくつかあります。だから、今私たちは沸騰するものを持っています:
Map<String,Object> result = jdbcTemplate.queryForMap("SELECT A, B, C FROM "+schema+".TABLE WHERE blablablah");
これはもちろん、オープンSQLインジェクションの脆弱性です。私たちはセキュリティ監査を計画しており、これには確実にフラグが立てられます。
質問:jdbcTemplate、別のSprintデータアクセスユーティリティ、またはプレーンjdbcの場合でも、クエリにスキーマを指定するにはどうすればよいですか?
あなたは、JDBC接続のためのスキーマを指定するConnection.setSchema
を使用することができ、 JGN
実際に文ごとに指定しますか?複数のスキーマからオブジェクトにアクセスしますか?あるいは、各セッションの作成時に、[a login trigger](http://stackoverflow.com/)のコードのいずれかで[set current_schema'](http://stackoverflow.com/a/20531823/266304)できますか? a/30127939/266304)は、アプリケーションユーザーを認識しますか? –
参照するデータベース・オブジェクトのOracleシノニムを作成できます。次に、SQLにスキーマを指定する必要はありません。 – GriffeyDog
問題は、スキーマ名がコーディング時にわかっていないということです。つまり、 'update(" ALTER SESSION SET_CURRENT_SCHEMA =? "、schemaNameFromAppProperties);' 私はうまくいきませんスキャン中にSQLインジェクションの脆弱性として再びフラグが立てられます: 'update(" ALTER SESSION SET CURRENT_SCHEMA = "+ schemaNameFromAppProperties") – JGN