面向对象编程世界里的单例模式(Singleton)可能是设计模式里最简单的一种,大多数开发人员都觉得可以很容易掌握它的用法。单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
然而在某些场景下,这种设计模式的单例特性会被破坏,看下面这个例子:
代码的第三行,这个ABAP类实现了接口if_serializable_object,这意味着它可以被关键字CALL TRANSFORMATION进行序列化和反序列化操作。
使用下面的ABAP代码:
DATA(lo_instance) = zcl_jerry_singleton=>get_instance( ).
DATA: s TYPE string.
CALL TRANSFORMATION id SOURCE model = lo_instance RESULT XML s.
DATA: lo_instance2 TYPE REF TO zcl_jerry_singleton.
CALL TRANSFORMATION id SOURCE XML s RESULT model = lo_instance2.
执行之后,在调试器里发现lo_instance和lo_instance2指向了两个不同的对象实例,说明此时这个ABAP单例模式已经被破坏了。
再看看Java,下面是一个最简单的Java单例模式:
然而我们仍然可以通过Java的反射机制来破坏这个单例:
Class<?> classType = JerrySingleton.class;
Constructor<?> c = classType.getDeclaredConstructor(null);
c.setAccessible(true);
JerrySingleton e1 = (JerrySingleton)c.newInstance();
JerrySingleton e2 = JerrySingleton.getInstance();
System.out.println(e1 == e2);
在Java里,我们可以通过枚举类来防御这种反射攻击:
public enum JerrySingletonAnotherApproach {
INSTANCE ;
private String name = "Jerry" ;
public String getName() {
return this.name;
}
}
这种单例模式的消费代码:
System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName());
此时别有用心的攻击者如果想使用反射机制创建新的实例,会收到下面的报错信息:
Exception in thread "main" java.lang.NoSuchMethodException: singleton.JerrySingletonAnotherApproach.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at singleton.SingletonAttack.test3(SingletonAttack.java:31)
at singleton.SingletonAttack.main(SingletonAttack.java:43)
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
文档详细介绍了用myeclipse生成webservice的方法步骤,以及abap调用webservice 第一步:myeclipse生成webservice 第二部:发布webservice 第三步:在sap系统生成webservice代理 第四步:生成port 第五步:用实例调用...
ABAP编辑器快速调用函数时自动填充调用参数 和 声明变量
SAP ABAP与JAVA之间通过RFC传递数据实例
JAVA调用ABAP程序,与ABAP调用JAVA程序的实例,包含JCO的API及所需jar文件. 文档文件中是中文实例.
6.类似Java,ABAP开发的程序能运行于任何操作系统(Java有Java虚拟机,ABAP也有ABAP processor),多种数据库(比如在ABAP字典中实现了透明表对各种底层数据库表的映射,这样在ABAP层看到的透明表就和具体数据库无关),各种...
java连接sap +jco3,代码成功测试,文件含有所需的类库。 限于window X86系统。
基于linux系统oracle数据库sap(ABAP+JAVA)安装手册,语言为纯英文。该文档内部链接全部真实有效。可以规避不必要的错误。
CEON ABAP Eclipse Editor
ABAP资料ABAP资料ABAP资料ABAP资料ABAP资料
ABAP 调用ABAP PROXY
ABAP - Keyword Documentation This documentation describes the syntax and meaning of the keywords of the ABAP language and its object-oriented part ABAP Objects. Alongside this, language frameworks ...
abap tips abap tips abap tips abap tips abap tips
ABAP加密和解密
abap 与 java web service 集成
ABAP Objects for Java Developers,好资料可以好好看看!
abap逻辑数据库ABAP数据库操作,abap过程中的小积累。用处多多哦
ABAP对JAVA加密的内容进行AES解密,或JAVA对ABAP的加密内容进行解密 提供现成所有源代码(包括ABAP的AES工具类 ),直接拷贝即可使用,达成与JAVA项目互通加密解密。
abap 函数大全 abap function abap function
SAP ABAP开发 BADI 屏幕增强资料,含BADI入门,SAP ABAP与JAVA之间通过RFC传递数据实例,SAP屏幕增强示例,SAP用户出口
SAP ABAP 开发手册,对SAP上ABAP开发有很大的帮助,希望对在SAP上开发者能够提供帮助