2016-12-03 6 views
1

である私は春ブーツフライウェイにプレースホルダを持つ準備文を書く方法はありますか?

CREATE ROLE application WITH LOGIN PASSWORD '${password}'; 

と、たとえば、このコードを記述して、移行を開始する前に

FLYWAY_PLACEHOLDERS_PASSWORD="' DROP table -- " 

を設定した場合、提供引用はよう、フライウェイは、注入を実行します表示されます文字列。これを準備されたステートメントにする方法はありますか、または値が適切に引用されるようにするために使用できる引用関数がありますか?

+0

https://github.com/flyway/flyway/issues/1500私はこれを開けました – xenoterracide

+0

'quote_literal'を試しましたか?私はPGがそこでの表現を可能にするかどうかわかりません。たとえそうでなくても、それをいくつかの動的SQLに埋め込み、 'DO'ブロック内で実行することができます。 – jpmc26

+0

@ jpmc26私はそれをすることができましたが、 'quote_literal($ {password})'で内容に ')'があるとどうなりますか?アフリカ人は基本的にテンプレートを処理しているので、私は誰かが巧妙に賭けて何かを実行することができます。それはおそらく今より安全です。 – xenoterracide

答えて

1

既存のクエリに対する小さな改善:%Lformatを使用して

DO $$ 
DECLARE 
    the_password TEXT := '${password}'; 
BEGIN 
    EXECUTE format('CREATE ROLE application WITH LOGIN PASSWORD %L', the_password); 
END 
$$ 

は、クエリの正しいエスケープを行います。 DECLARE/BEGIN/ENDブロックとドル引用符付きの文字列をすべて閉じない文は、解析エラーになります。

これは注入の可能性をすべて排除するものではありませんが、ここでの文脈に留意してください。これはデータベース移行システムです。私はそれが信頼されていないユーザーからの任意の入力を使用して実行されていないと仮定します。これは、役割の作成、テーブルの作成/削除などに必要な権限を持つ資格情報にアクセスする信頼性の高いユーザーによってのみ実行される必要があります。このように、これはセキュリティメカニズムではなく、馬鹿証明の練習です。このクエリは、事故による損害の発生を防止します。これを壊したものは悪意のある可能性が高く、ユーザーが展開システムを完全にバイパスした場合にはより簡単に達成できます。

+0

あなたが考えていない何かが、これについてドッカーと働いています。問題の一部)が、ドッキング・クラウド(現在は私です)やkubernetesなどのドッカーを使用しているとします。上記のシステムのいずれかの部分が妥協してしまえば...すべてが公平であれば、これはいくつかの点で損害を制限する可能性があると言っている。もちろん、私はこのユーザーをどのように設定しているのかを変えて、移行ツールで「スーパーユーザー」の権限を必要としないようにすることもできます。コードの改善をありがとう。 – xenoterracide

+1

最終的に私の解決策は、その脆弱性のためにフライウェイをパラメータ化することではありません。 この問題の特定の部分については、Postgresの独自の変数を引用することができる、最初の実行時にSQLスクリプトを読み込むためにpostgresドッカーのイメージを使用しています。 https://xenoterracide.com/post/sql-injection-with-spring-boot-and-flyway/ – xenoterracide

関連する問題