mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-02-13 04:50:32 +08:00
Merge pull request #18 from top37/patch-1
Update 89. 对于实例控制,枚举类型优于 readResolve.md
This commit is contained in:
commit
b09a31df1e
@ -112,7 +112,7 @@ public class ElvisImpersonator {
|
|||||||
|
|
||||||
通过将 `favoriteSongs` 字段声明为 `transient`,可以修复这个问题,但是最好把 `Elvis` 做成一个单元素的枚举类型(详见第 3 条)。就如 `ElvisStealer` 攻击所示范的,用 `readResolve` 方法防止“临时”被反序列化的实例收到攻击者的访问,这种方法十分脆弱需要万分谨慎。
|
通过将 `favoriteSongs` 字段声明为 `transient`,可以修复这个问题,但是最好把 `Elvis` 做成一个单元素的枚举类型(详见第 3 条)。就如 `ElvisStealer` 攻击所示范的,用 `readResolve` 方法防止“临时”被反序列化的实例收到攻击者的访问,这种方法十分脆弱需要万分谨慎。
|
||||||
|
|
||||||
如果将一个可序列化的实例受控的类编写为枚举,Java 就可以绝对保证出了所声明的常量之外,不会有其他实例,除非攻击者恶意的使用了享受特权的方法。如 `AccessibleObject.setAccessible`。能够做到这一点的任何一位攻击者,已经拥有了足够的特权来执行任意的本地代码,后果不堪设想。将 Elvis 写成枚举的例子如下所示:
|
如果将一个可序列化的实例受控的类编写为枚举,Java 就可以绝对保证除了所声明的常量之外,不会有其他实例,除非攻击者恶意的使用了享受特权的方法。如 `AccessibleObject.setAccessible`。能够做到这一点的任何一位攻击者,已经拥有了足够的特权来执行任意的本地代码,后果不堪设想。将 Elvis 写成枚举的例子如下所示:
|
||||||
```java
|
```java
|
||||||
// Enum singleton - the preferred approach
|
// Enum singleton - the preferred approach
|
||||||
public enum Elvis {
|
public enum Elvis {
|
||||||
|
Loading…
Reference in New Issue
Block a user