当前位置: 首页 > wzjs >正文

网站的域名和密码是什么意思wordpress oop

网站的域名和密码是什么意思,wordpress oop,电子商务网站建设与规划总结,aso关键词优化计划前言: 我们知道实现单例模式的方式有三种,分别是:双重锁,静态内部类,枚举类 其中枚举类是最优雅,最安全的实现方式 相信绝大多数人最开始学的单例模式的实现就是双重锁的实现,这种方式虽然保证的线程安全和懒加载,但是仍然存在两个问题,会导致单例模式被破坏 通过反射可以获取到…

前言:
我们知道实现单例模式的方式有三种,分别是:双重锁,静态内部类,枚举类
其中枚举类是最优雅,最安全的实现方式
相信绝大多数人最开始学的单例模式的实现就是双重锁的实现,这种方式虽然保证的线程安全和懒加载,但是仍然存在两个问题,会导致单例模式被破坏

  1. 通过反射可以获取到类的相关信息,访问到类的私有构造方法,再次创建一个实例对象,破坏单例模式
  2. 先序列化,再反序列化:每一次反序列化(字节流转换为Java对象)都会创建一个新的Java对象,也会破坏单例模式

枚举类可以很好的解决上述两种问题,原因如下:

  1. 枚举类无法通过反射获取私有方法,如果尝试获取就会抛出异常
  2. 枚举类实现了serilizable接口,反序列化创建的java对象始终唯一

以下是原理讲解


🧱 一、你需要知道的基本概念

🔑 1. 什么是反射攻击?

Java 的反射(Reflection)机制允许你在运行时访问类的私有构造方法,这就可能绕过单例模式的限制,创建多个实例。

👉 举例说明:

Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton newInstance = constructor.newInstance();  // 又创建了一个新对象

🔑 2. 什么是序列化攻击?

当你对一个对象序列化后再反序列化,如果没有处理好 readResolve() 方法,可能会重新创建一个新的实例。

👉 举例说明:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.ser"));
oos.writeObject(singleton);  // 序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.ser"));
Singleton newInstance = (Singleton) ois.readObject();  // 又是一个新对象

🚧 二、普通单例是如何被破坏的?

我们先看看一个普通单例是如何被攻击的:

🚫 普通单例类:

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

🔨 利用反射:

Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton another = constructor.newInstance();  // 💥 新的对象!

即使你用了 private 构造函数,反射还是可以绕过访问控制


✅ 三、枚举类如何防反射攻击?

🧠 枚举的底层原理(JVM限制)

枚举的构造方法会被编译器标记为 private,并且由 JVM 明确规定:

不能通过反射来创建枚举类的实例。

👉 举个例子:

public enum SingletonEnum {INSTANCE;
}

🔍 用反射尝试攻击:

Constructor<SingletonEnum> constructor = SingletonEnum.class.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
SingletonEnum instance = constructor.newInstance("INSTANCE", 0);

🔥 运行时会抛出异常:

java.lang.IllegalArgumentException: Cannot reflectively create enum objects

✅ 原因:

JVM 源码中明确做了限制(在 Reflect.newInstance()ConstructorAccessorImpl.newInstance()):

if (clazz.isEnum()) {throw new IllegalArgumentException("Cannot reflectively create enum objects");
}

🚫 所以:枚举类实例无法通过反射创建,天然防御反射攻击。


✅ 四、枚举类如何防序列化攻击?

🔁 普通类的反序列化攻击原理

如果一个单例类实现了 Serializable,默认情况下每次反序列化都会创建新对象,除非你手动实现 readResolve() 方法。

🔍 漏洞示意:

public class Singleton implements Serializable {private static final Singleton instance = new Singleton();public static Singleton getInstance() { return instance; }
}

即使是单例,序列化再反序列化后:

Singleton s1 = Singleton.getInstance();
Singleton s2 = deserialize("singleton.obj");
System.out.println(s1 == s2);  // false ❌

🧠 而枚举类型在反序列化时自动保证单例!

public enum SingletonEnum {INSTANCE;
}

⚙ 枚举类自动实现了 Serializable,并且 JVM 源码中会调用:

return Enum.valueOf(enumType, name); // 返回同一个实例

即便你什么都不写,枚举的反序列化机制会自动返回枚举常量 INSTANCE始终是同一个对象


📘 来自《Effective Java》的权威背书

在《Effective Java》第三版第3条中,作者 Joshua Bloch 写道:

“枚举类型是实现单例的最佳方式。它简洁、自动支持序列化机制,并提供了对抗多重实例化攻击的绝对保障,即使面对复杂的反射和序列化攻击。”


✅ 总结:枚举单例的天然安全性

安全防护项普通单例需要额外处理枚举单例
线程安全❌(需加锁或静态内部类)✅ JVM 保证
反射攻击❌(可被破坏)✅ JVM 禁止
序列化攻击❌(需要重写 readResolve()✅ JVM 自动处理
写法简洁✅✅✅

🏁 如果你记住一句话:

枚举单例,是唯一能在 语言层面 自动防止反射 + 反序列化攻击的实现方式,也是 Java 实现单例模式的终极形态。



文章转载自:

http://7wJC7Joe.zwxfj.cn
http://h4kgMzaq.zwxfj.cn
http://UYgZQuGb.zwxfj.cn
http://VxT3bvvH.zwxfj.cn
http://mwchiAjx.zwxfj.cn
http://PXrJkjUj.zwxfj.cn
http://8YSjCWZU.zwxfj.cn
http://Isib4YZC.zwxfj.cn
http://g7rCNu13.zwxfj.cn
http://sNpZsLDj.zwxfj.cn
http://zhw1XomY.zwxfj.cn
http://JYatGRyV.zwxfj.cn
http://9dO6P1IE.zwxfj.cn
http://rqADynVi.zwxfj.cn
http://NuiAGlLR.zwxfj.cn
http://CZQ5qY3V.zwxfj.cn
http://eYz66FgF.zwxfj.cn
http://xiMLY0cz.zwxfj.cn
http://3NVU6qc7.zwxfj.cn
http://0PAVrRgn.zwxfj.cn
http://VciQKeBG.zwxfj.cn
http://XRjJWBnl.zwxfj.cn
http://fSmI2jbW.zwxfj.cn
http://vpV4hgvT.zwxfj.cn
http://dfrI1Ghx.zwxfj.cn
http://e8K6Y0P8.zwxfj.cn
http://X38elEip.zwxfj.cn
http://VM7G5j7n.zwxfj.cn
http://5yF2MHvZ.zwxfj.cn
http://wqkwAKLy.zwxfj.cn
http://www.dtcms.com/wzjs/732787.html

相关文章:

  • 长治哪里做网站网站建设客户常问到的问题
  • 西部数码网站空间网站无障碍建设
  • 国外好的设计欣赏网站照片合成制作app
  • 网站建设与管理找工作伦教九江网站建设
  • 网站权重接口国外网站代做
  • 设计素材网站合集id中怎么导入wordpress
  • 怎么帮自己做的网站申请地址济南易搜的网站建设
  • 做谷歌网站使用什么统计代码常用的h5制作工具有哪些
  • 装修公司网站模板网站的建设方法不包括什么
  • html网页制作基础教程大连网站优化技术
  • 山东大汉建设机械有限公司网站淮安市建设监理协会网站
  • 网站建设服务非常好湖南岚鸿公司用ps怎么做网站
  • 谢岗网站建设wordpress 软件公司模板
  • 网站建设什么因素最重要做本地的分类信息网站
  • 深圳企业网站建设专业手机软件开发公司排名
  • 电线电缆做销售哪个网站好韶山市建设局网站
  • 临沂网站建设价格低wordpress拼音插件
  • wordpress网站邀请码wordpress学生
  • 那个做兼职网站好宣传片报价单明细
  • 学网站开发和游戏开发那个为新创业公司建设网站
  • 宁夏网站营销推广深圳聘请做网站人员
  • 株洲做网站建设h5响应式网站是什么意思
  • iis6建设网站浏览犀牛建筑网校
  • 专业网站建设哪个好学校网站建设规范
  • 网站设计怎么边加载变查看建立个人网站的详细步骤
  • 广州营销型企业网站建设网页出现网站维护
  • 化工原料价格查询网站网站搭建 成都
  • wordpress单位内网做网站云南网站的设计公司简介
  • 网站建设包涵哪些领域wordpress博客批量发布
  • 在线一键免费生成网页网站广州注册公司流程和费用