簡體   English   中英

在安全性方面,非最終公共實例和非最終公共實例字段之間的區別?

[英]Difference between non- final public static and non- final public instance fields in terms of security?

我正在瀏覽這個鏈接, OBJ10-J。 不要使用公共靜態非最終字段 ,它說,

客戶端代碼可以簡單地訪問公共靜態字段,因為安全管理器不會檢查對這些字段的訪問。

那是什么意思呢? 即逃離安全經理他們是什么意思?

如果它們只是意味着因為字段是非最終的public ,那么非最終的 public實例字段與static字段的不同之處呢? (就代碼安全而言)

我已經經歷過這個問題並且在安全方面沒有看到任何提及, 為什么靜態變量被認為是邪惡的

public類的public static字段可以從任何地方訪問,因此也可以訪問public實例字段,那么區別在哪里? 為什么非最終 public實例字段不是安全問題而是static

那是因為OBJ01-J已經涵蓋了非靜態字段的情況 限制字段​​的可訪問性

OBJ01-J涵蓋public實例字段,原因略有不同。 首先,您需要在更改公共實例字段之前引用實例,而可以在類級別直接訪問公共靜態字段。 但兩者都違反了CERT規則。

為什么非最終公共實例字段不是安全問題而是靜態?

如果要訪問實例字段,則需要對該對象實例的引用。 如果您沒有參考,則無法訪問它。

因此,您的代碼可以控制傳遞引用的對象。 如果惡意代碼試圖使用反射來劫持您的一個對象以獲取引用,則可以安裝安全管理器來防止這種情況發生。

另一方面,可以從有權訪問該類的每個人訪問public static字段,因為可以訪問Class對象。 所以惡意代碼可能只會使用

YourClass.PUBLIC_INSTANCE_FIELD = someValue;

或反思方式

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM