私は、ホルダーイディオムまたはダブルチェックロッキングのいずれかを使用して、 'getInstance()'を呼び出す代わりにリフレクションを使用してインスタンス化し、 'getInstance()'を呼び出すと、パターン。Java:レイジーロードシングルトンとリフレクション攻撃?
クラスに静的な 'counter'メンバーを追加し、クラスのプライベートコンストラクタでそれをインクリメントし、 '1'を超える場合は例外をスローします。しかし、その場合、最初にリフレクションを通してインスタンス化すると、誰も例外をスローせずに 'getInstance()'を呼び出すことができなくなります。
シングルトンを怠惰にロードしても、この攻撃からそれを防ぐ方法を教えてください。 (私は 'Enum'パターンを認識していますが、実際にはハックだと感じる人もいます。この回答のコメントを確認してください:is this Singleton resistant to both Serialization and Reflection Attacks?とbtw、私の質問は異なります)。
EDIT:DCLの場合は、静的カウンタフィールド、クラスベースの同期コンストラクタを使用し、 'this'を静的メンバーに割り当てることで回避できます。しかし、ホルダーイディオムの場合にそれを防ぐ方法を確かめないでください。
インスタンスが1つだけハックされていることを明示する列挙型はどうですか。それはより簡単で、あなたの問題をある程度解決するでしょう。おそらく明らかな答えに与える時間。 ;)BTW:Unsafeクラスで新しいenumインスタンスを作成できます。 –
まあ、私は列挙型のシングルトンに対して個人的なものは何も持っていませんが、誰もが正しい方法だと同意していないので、探索したいと思っています。 :) Btw、Unsafe ref。のthxは、あなたが新しいenumを作成できることを知りませんでした。それに対して+1。 – shrini1000
十分な特権を持つコードは何かを行うことができます...あなた自身のコードを強化することで攻撃を防ぐことはできません。信頼できないコードから特権を取り除くだけです。 – CurtainDog