2016-01-11 4 views
9

私は、このリンクを介してOBJ10-J. Do not use public static nonfinal fieldsをつもりですし、それは、そのようなフィールドへのアクセス はセキュリティマネージャによって確認されていないので、セキュリティの観点から、非最終公開のパブリックインスタンスフィールドと最終的でないパブリックインスタンスフィールドの違いは?

クライアントコードは自明パブリック静的フィールドにアクセスすることができ、と言います。

実際にはどういう意味ですか?つまり、セキュリティマネージャから逃れることによって何を意味するのでしょうか?

フィールドが非最終publicているので、彼らは単にそれを意味している場合、どのように非最終来る、publicインスタンスは、そのstatic対応よりも異なるフィールド?

私はこの質問をしてきたと、セキュリティの面で一切の言及を見ていない、Why are static variables considered evil

publicクラスのpublic staticフィールドはとてもpublicインスタンスフィールドあまりにもどこからでもアクセス可能となり(限り、コードのセキュリティを懸念しています) 、違いはどこですか?理由不確定publicインスタンスのフィールドにセキュリティの問題はありませんが、staticは?非静的フィールドの場合は、既にOBJ01-J. Limit accessibility of fields

publicインスタンスフィールドによって覆われているため

答えて

4

はわずかに異なる理由でOBJ01-Jによって覆われています。 1つは、パブリックインスタンスフィールドを変更する前にインスタンスへの参照を持つ必要がありますが、public staticフィールドはクラスレベルで直接アクセスできます。しかし、どちらもCERTルールに反する。

+0

反射方法を使用する可能性がありますか?私が理解していることは、 'public'フィールドはどこからでもアクセスできるように意図されており、** refelction **などを無効にすることは影響を与えないか、セキュリティマネージャにこれらのアクセスを含める方法がないことです。 –

+0

@SabirKhanはい、正しいですが、PublicフィールドはSecurityManagerで制御できません。通常はアクセスできない非公開フィールドにはリフレクションでアクセスできますが、SecurityManagerを使用してリフレクションによるアクセスを無効にしたり、アクセスを制御することができます。 –

4

セキュリティの問題ではなく、静的ではない最終的なパブリックインスタンスのフィールドはなぜですか?

インスタンスフィールドにアクセスするには、そのオブジェクトインスタンスへの参照が必要です。参照がない場合はアクセスできません。

あなたのコードは照会が渡されるオブジェクトを制御できます。悪意のあるコードがリフレクションを使用してオブジェクトの1つをハイジャックして参照を取得しようとすると、これを防ぐためにセキュリティマネージャをインストールすることができます。

public staticフィールドには、Classオブジェクトにアクセスできるため、クラスにアクセスできるすべてのユーザーからアクセスできます。だから、悪意のあるコードは、ここにもなるように文(パブリックインスタンスフィールドは、セキュリティマネージャを逃れること)適用、右

YourClass.PUBLIC_INSTANCE_FIELD = someValue; 

または

Class clazz = Class.forName("YourClass"); 
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD"); 
publicStaticField.set(null, someValue); 
+0

'Class Object'にアクセス制限を適用する方法はありませんか?最終的にはそれもオブジェクトですが、ヒープには保持されません。 –

+0

@SabirKhan「クラスオブジェクトにアクセス制限を適用する」という意味がわかりません。メインメモリ(RAM)がハイジャックされるのを防ぎたいですか? –

+0

私が尋ねるべきことは、あなたの例のクラス名が 'YourClass'が' java.lang.Class'のインスタンスですか? 'YourClass'が単純に' java.lang.Class'型の参照であれば、(ヒープオブジェクトのために提案されるような)セキュリティマネージャをそれに適用することもできますし、**セキュリティマネージャは** jvm **に適用することもできません。クラス 'オブジェクト? –

関連する問題