面向对象编程世界里的单例模式(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.()
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的原创文章,请关注公众号"汪子熙":

ABAP和Java里的单例模式攻击相关推荐

  1. ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

    ABAP 740的新语法: 上图的代码相当于: DATA: ls_data LIKE LINE OF it_data. READ TABLE it_data INTO ls_data WITH KEY ...

  2. SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)

    Jerry前一篇文章 SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析 介绍了在ABAP里判断引用变量是否包含了一个有效引用的关键字:IS ...

  3. 如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

    这是 Jerry 2021 年的第 47 篇文章,也是汪子熙公众号总共第 324 篇原创文章. Jerry 2014 年时,曾经在 SAP 社区上写过一篇英文博客,介绍了如何在 ABAP On-Pre ...

  4. JavaScript, ABAP和Scala里的尾递归(Tail Recursion)

    这是Jerry 2021年的第 12 篇文章,也是汪子熙公众号总共第 283 篇原创文章. 今天是2021年1月20日,看看历史上的今天都发生了什么. 2004年1月20日,第一个公开版本的Scala ...

  5. ABAP和Java单例模式的攻防

    2019独角兽企业重金招聘Python工程师标准>>> ABAP CLASS zcl_jerry_singleton DEFINITIONPUBLICFINALCREATE PRIV ...

  6. 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数

    最近Jerry接到一个原型开发的任务,需要在微信里调用ABAP On Premise系统(SAP CRM On-Premise)里的某些函数.具体场景和我之前的公众号文章 Cloud for Cust ...

  7. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  8. Java里的堆(heap)栈(stack)和方法区(method)

    http://imiduo.iteye.com/blog/616310 Java里的堆(heap)栈(stack)和方法区(method)  <一> 基础数据类型直接在栈空间分配, 方法的 ...

  9. Java多线程之单例模式在多线程环境下的安全问题

    Java多线程之单例模式在多线程环境下的安全问题 目录: 单例模式基本概念 单线程下的单例模式 多线程下的单例模式 单例模式volatile分析 1. 单例模式基本概念 基本概念转载自:单例模式|菜鸟 ...

最新文章

  1. 让人“眼前一亮、不明觉厉”的互联网技术PPT
  2. ros与下位机通信常用的c++ boost串口应用
  3. 快手在直播间里养起了AI宠物,连柳岩、大鹏都爱不释手
  4. 数据结构-joseph环
  5. sys.stdin.read和raw_input函数
  6. 《疯狂Java讲义》(二十九)---- JDBC
  7. 3dmax导出obj序列_Houdini导出序列图片
  8. python爬虫项目报告需求分析_网络爬虫需求分析报告
  9. w10 http基本原理 Nginx部署
  10. React Native的缓存和下载
  11. MySQL中grant之后要跟着flush privileges吗?
  12. python发送文件到指定的邮箱_python笔记:批量将指定附件发送到指定邮箱地址
  13. oracle里的ols机制,[Oracle] 数据库安全之 - Oracle标签安全(OLS)
  14. 嵌入式系统python开发_嵌组词_嵌的拼音含义_组词造句解释_嵌字的组词
  15. 券商卖的雪球票息高,券商赚的什么钱?(雪球原理入门)
  16. android 仿微信 视频播放器,Android仿微信多媒体选择器 - SmartMediaPicker
  17. 一秒批量修改文件扩展名(后缀名)
  18. Linux命令之重启命令
  19. 详述 GitHub 如何将代码从原分支合并到 fork 分支
  20. 面向对象方法学(2)

热门文章

  1. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式
  2. 初涉网络流 POJ 1459 Power Network
  3. ODPS SQL for 数据操作语言DML
  4. SDWebImage源码阅读(九)SDWebImageDownloader
  5. html空白文字宽度
  6. 不同进制数的表示方法
  7. 安装 Android studio 运行 爆出 Unable to access Android SDK add-on list -...
  8. 分布式与人工智能课程(part7)--两种绘图思路
  9. 文献学习(part24)--Splitting Methods for Convex Clustering
  10. 20应用统计考研复试要点(part7)--统计学