mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-02-08 18:40:21 +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` 方法防止“临时”被反序列化的实例收到攻击者的访问,这种方法十分脆弱需要万分谨慎。
|
||||
|
||||
如果将一个可序列化的实例受控的类编写为枚举,Java 就可以绝对保证出了所声明的常量之外,不会有其他实例,除非攻击者恶意的使用了享受特权的方法。如 `AccessibleObject.setAccessible`。能够做到这一点的任何一位攻击者,已经拥有了足够的特权来执行任意的本地代码,后果不堪设想。将 Elvis 写成枚举的例子如下所示:
|
||||
如果将一个可序列化的实例受控的类编写为枚举,Java 就可以绝对保证除了所声明的常量之外,不会有其他实例,除非攻击者恶意的使用了享受特权的方法。如 `AccessibleObject.setAccessible`。能够做到这一点的任何一位攻击者,已经拥有了足够的特权来执行任意的本地代码,后果不堪设想。将 Elvis 写成枚举的例子如下所示:
|
||||
```java
|
||||
// Enum singleton - the preferred approach
|
||||
public enum Elvis {
|
||||
|
Loading…
Reference in New Issue
Block a user