10

このリンクOBJ10-J を使用しています。public static nonfinal フィールドを使用しないでください。

public static フィールドへのアクセスはセキュリティ マネージャによってチェックされないため、クライアント コードは簡単に public static フィールドにアクセスできます。

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

field がfinalおよびpublicではないという理由だけでそれを意味しているのであれば、なぜfinal 以外のインスタンスpublicフィールドが対応するフィールドと異なるstaticのでしょうか? (コードのセキュリティに関する限り)

私はこの質問をしてきましたが、セキュリティに関する言及は見たことがありません。静的変数はなぜ悪と見なされるのですか

publicクラスのpublic staticフィールドはどこからでもアクセスできるので、publicインスタンス フィールドにもアクセスできるので、違いはどこにあるのでしょうか? 非最終 publicインスタンス フィールドがセキュリティ上の問題ではなく、存在するのはなぜstaticですか?

4

2 に答える 2

5

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

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

そのため、参照が渡されるオブジェクトをコードで制御できます。悪意のあるコードがリフレクションを使用してオブジェクトの 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);
于 2016-01-11T09:28:25.817 に答える
4

これは、非静的フィールドのケースがOBJ01-J で既にカバーされているためです。フィールドのアクセシビリティを制限する

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

于 2016-01-11T09:17:16.197 に答える