Merge pull request #18 from top37/patch-1

Update 89. 对于实例控制,枚举类型优于 readResolve.md
This commit is contained in:
Joe 2019-08-19 20:45:02 +08:00 committed by GitHub
commit b09a31df1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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 {