2016-01-11 9 views
9

ich über diesen Link werde, OBJ10-J. Do not use public static nonfinal fields und es sagt, dassUnterschied zwischen nicht endgültigen öffentlichen statischen und nicht finalen öffentlichen Instanzfeldern in Bezug auf Sicherheit?

Client-Code triviale öffentliche statische Felder zugreifen kann, weil der Zugang auf solche Felder nicht von einem Sicherheitsmanager überprüft.

was bedeuten sie eigentlich damit? Was bedeuten sie, wenn sie dem Sicherheitsmanager entkommen?

Wenn sie bedeutet es einfach, weil Feld nicht endgültigen und public zu sein, dann, wie nicht endgültige kommen, public Instanz als ihre Pendants static verschiedene Bereiche? (Soweit Code Sicherheit betroffen ist)

Ich habe durch diese Frage und haben keine Erwähnung in Bezug auf die Sicherheit gesehen, Why are static variables considered evil

public Klasse public static Felder würden zugänglich sein von überall und so public Instanzfelder zu Wo ist der Unterschied? Warum nicht-finalpublic Instanzfelder kein Sicherheitsproblem, sondern static ist?

Antwort

4

Das ist, weil der Fall von nicht-statischen Feldern bereits durch OBJ01-J. Limit accessibility of fields

public Instanzfeld abgedeckt werden leicht unterschiedliche Gründe von OBJ01-J bedeckt. Zum einen müssen Sie einen Verweis auf eine Instanz haben, bevor Sie öffentliche Instanzfelder ändern können, während auf öffentliche statische Felder direkt auf Klassenebene zugegriffen werden kann. Aber beide sind gegen die CERT-Regeln.

+0

so dass Satz (die öffentlichen Instanzfelder Sicherheitsmanager entkommen) anwendbar auch hier, nicht wahr? Was ich darunter verstehe, sind "öffentliche" Felder, auf die von überall zugegriffen werden kann und das Deaktivieren von ** refelction ** usw. hat keine Auswirkungen oder es gibt keine Möglichkeit, diese Zugriffe in den Sicherheitsmanager einzubeziehen. –

+0

@SabirKhan Ja, das ist richtig, öffentliche Felder können nicht von einem SecurityManager kontrolliert werden.Auf nicht öffentliche Felder, auf die normalerweise nicht zugegriffen werden kann, kann durch Reflektion zugegriffen werden. Sie können jedoch den SecurityManager verwenden, um den Zugriff durch Reflektion zu deaktivieren oder zu steuern. –

4

Warum nicht finale öffentliche Instanzfelder kein Sicherheitsproblem darstellen, sondern statisch sein müssen?

Wenn Sie auf ein Instanzfeld zugreifen möchten, benötigen Sie den Verweis auf diese Objektinstanz. Wenn Sie keine Referenz haben, können Sie nicht darauf zugreifen.

So kann Ihr Code steuern, an welche Objekte eine Referenz übergeben wird. Wenn bösartiger Code versucht, eines Ihrer Objekte zu übernehmen, um eine Referenz zu erhalten, können Sie einen Sicherheitsmanager installieren, um dies zu verhindern.

Auf der anderen Seite kann ein public static Feld von jedem zugegriffen werden, der Zugriff auf die Klasse hat, weil das Objekt Class zugänglich ist. So könnte bösartiger Code verwendet nur

YourClass.PUBLIC_INSTANCE_FIELD = someValue; 

oder die Reflexion Weg

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

Also gibt es keine Möglichkeit, Zugriffsbeschränkungen für 'Class Object' anzuwenden? Irgendwann ist das auch ein Objekt, aber nicht in Haufen, oder? –

+0

@SabirKhan Ich weiß nicht, was Sie mit "Zugriffsbeschränkungen für Klassenobjekt anwenden" meinen. Möchten Sie den Hauptspeicher (RAM) davor schützen, entführt zu werden? –

+0

Was ich fragen wollte ist, ist Klassenname in Ihrem Beispiel 'YourClass' eine Instanz von' java.lang.Class'? Wenn also 'YourClass' einfach eine Referenz vom Typ 'java.lang.Class' ist, kann ich auch den Sicherheitsmanager darauf anwenden (wie für Heap-Objekte vorgeschlagen) oder den Sicherheitsmanager nicht auf ** jvm ** created' anwenden Klassenobjekte? –

Verwandte Themen