2012-04-13 17 views
2

私は、ホルダーイディオムまたはダブルチェックロッキングのいずれかを使用して、 'getInstance()'を呼び出す代わりにリフレクションを使用してインスタンス化し、 'getInstance()'を呼び出すと、パターン。Java:レイジーロードシングルトンとリフレクション攻撃?

クラスに静的な 'counter'メンバーを追加し、クラスのプライベートコンストラクタでそれをインクリメントし、 '1'を超える場合は例外をスローします。しかし、その場合、最初にリフレクションを通してインスタンス化すると、誰も例外をスローせずに 'getInstance()'を呼び出すことができなくなります。

シングルトンを怠惰にロードしても、この攻撃からそれを防ぐ方法を教えてください。 (私は 'Enum'パターンを認識していますが、実際にはハックだと感じる人もいます。この回答のコメントを確認してください:is this Singleton resistant to both Serialization and Reflection Attacks?とbtw、私の質問は異なります)。

EDIT:DCLの場合は、静的カウンタフィールド、クラスベースの同期コンストラクタを使用し、 'this'を静的メンバーに割り当てることで回避できます。しかし、ホルダーイディオムの場合にそれを防ぐ方法を確かめないでください。

+1

インスタンスが1つだけハックされていることを明示する列挙型はどうですか。それはより簡単で、あなたの問題をある程度解決するでしょう。おそらく明らかな答えに与える時間。 ;)BTW:Unsafeクラスで新しいenumインスタンスを作成できます。 –

+0

まあ、私は列挙型のシングルトンに対して個人的なものは何も持っていませんが、誰もが正しい方法だと同意していないので、探索したいと思っています。 :) Btw、Unsafe ref。のthxは、あなたが新しいenumを作成できることを知りませんでした。それに対して+1。 – shrini1000

+3

十分な特権を持つコードは何かを行うことができます...あなた自身のコードを強化することで攻撃を防ぐことはできません。信頼できないコードから特権を取り除くだけです。 – CurtainDog

答えて

0

は個人的に私は列挙型に固執するが、需要ホルダー(IODH)イディオム

これは、効果的なJavaで表示されます
static class SingletonHolder { 
    static Singleton instance = new Singleton();  
} 

public static Singleton getInstance() { 
    return SingletonHolder.instance; 
} 

(項目48)の初期化もありますが、私は最初でポストからそれを聞きましたクレイジーボブ

http://blog.crazybob.org/2007/01/lazy-loading-singletons.html

は興味深い議論のロットのhttp://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dclを参照してください。

+0

これは、どのようにして、そのシングルトンの複数のオブジェクトを作成するコンストラクタベースのリフレクション攻撃を防ぎますか? (btw、私は私の質問で 'ホルダーイディオム'と言いましたが、私は同じアプローチを意味しました)。 – shrini1000

関連する問題