`
ouyangfei0426
  • 浏览: 126949 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

封装的漏洞

    博客分类:
  • java
阅读更多

 

我们都知道封装有很多优点,请看如下代码:

public class Man {

private String name;

private int age;

public int getAge() {

return age;

}

public String getName() {

return name;

}

public void setAge(int i) {

If(age<=0)

return;

age = i;

}

public void setName(String string) {

name = string;

}

}

 

如果,我们要将 name 拆分为 firstname lastname ,对于访问器的代码,我们可以改写为如下:

public String getName() {

return firsst name +" "+lastname ;

}

这样,除了改变类的方法外,不会影响其他代码 , 这样有利于降低程序的耦合性。

还有就是更改器可执行错误检查,不合条件的值可以不予处理。

比如,我们想设置 age 的值,其值必须大于 0 。我们可以在 setAge 方法里面做检查。

         可是难道我们把类的实例域设置为私有的( private ),然后提供其访问器与更改器,就真的实现了封装了吗?

         请看如下代码:

public class Order{

private Man man;

 

public Man getMan() {

return man;

}

 

public void setMan(Man man) {

this.man = man;

}

 

}

该类中有个实例变量:引用 Man 的实例对象一个 man 。它的访问器方法返回的是一个 Man 对象。这样做,其实没有起到封装的作用。如:

Order o=…;

Man man=o.getMan();

man.setName("mark");

System.out.println( o .getMan().getName() ); // 输出 mark

这样就改变了原 Order 对象中实例域 man 的状态(一般类都有一组特定的实例域值,这些值的集合就是这个对象的当前状态), man 中的 name 属性由原来的值变为了 "mark" 。很显然这是一个有漏洞的封装!!!

所以对于这种引用类型的实例域,我们应该改写其访问器方法为:

public Man getMan() {

return (Man)man.clone() ;

}

此时 Man 类的代码需要改写为:

 

public c lass Man implements Cloneable {//实现标记接口Cloneable。意味这该Man类可以克隆

private String name;

private Date birthday;

private int age;

 

public String getName() {

return name;

}

public void setName(String string) {

name = string;

}

public Man(String name,Date d,int age) {

this.name = name;

this.birthday=d;

this.age=age;

}

/**

  * 覆盖Object中的clone()方法。

  */

public Object clone() throws CloneNotSupportedException {

Man cloned = (Man)super.clone();//浅克隆(不会克隆子对象, 对象需单独克隆)

cloned.birthday=(Date)birthday.clone();//克隆子对象

return cloned;

 

}

public int getAge() {

return age;

}

public Date getBirthday() {

return birthday;

}

public void setAge(int i) {

age = i;

}

public void setBirthday(Date date) {

birthday = date;

}

}

 

这样就不会出现上面所说的封装漏洞了

         这里,顺便说一下 final 实例域。将实例域定义为 final ,构建对象时就必须初始化这样的域,也就是说,必须确保在每一个构造器执行之后,这个域的值被设置,且在后面的操作中,不能够再对它进行修改。

         final 修饰符大都应用于基本数据,或者不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类, String 类就是一个不可变的类)。对于可变的类,使用 final 修饰可能会对读者造成混乱。例如,

private final date birthday;

  仅仅意味着存储在 birthday 变量中的对象引用在对象构造之后不能改变,而并不意味着 birthday 引用的 Date 实例对象是一个常量,任何方法都可以对 birthday 引用的 Date 对象调用 setTime 方法改变 birthday 引用的 Date 实例对象的状态。

分享到:
评论

相关推荐

    教你简单的在win7系统下集成系统漏洞并封装.doc编程资料

    教你简单的在win7系统下集成系统漏洞并封装.doc

    雨林木风封装工具

    先下载一个PE→找一台测试机安装原版XP→安装常用软件如office、PDF等(根据需要,最好安装一个驱动精灵带网卡驱动版)→打系统漏洞补丁→使用该工具封装→重启之后不要进系统使用PE引导→制作当前系统状态GHOST→将...

    多功能组件封装

    和开发的迭代几进几出,仍然漏洞无数! 浪费时间就等于浪费生命!我几乎无法忍受这样的事情。于是我们决定把许多复杂而频 繁的工作封装成二次开发组件,大大简化开发工作,同时也提供开发的安全性,缩短开发周 ...

    CVE-2018-2893:Oracle WebLogic Server 远程代码执行漏洞分析预警

    攻击者可以在未授权的情况下将 payload 封装在 T3 协议中,通过对 T3 协议中的 payload 进行反序列化,从而实现对存在漏洞的 WebLogic 组件进行远程攻击,执行任意代码并可获取目标系统的所有权限。漏洞危害通过该...

    基于leagueflysystem进行二次的封装,适配主流对象存储厂商.rar

    某个技术组件版本升级,依赖包升级导致部分语法或者API过期,或者组件修复紧急的漏洞,从而会导致分布式系统下各个服务被动的升级迭代,很容易引发意外的问题;不同的服务中对组件的依赖和版本各不相同,从而导致不...

    对js与android交互进行的封装,可自定义协议,没有js注入漏洞,安全可靠,兼容android所有系统版本.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    防漏洞数据库窗体登录

    这是对上一个vs2008连接Acess数据库的改进版本,更加安全一点,希望大家能看明白,中间有一部分代码我用函数封装起来,另外数据库上一个vs2008连接Acess数据库窗体登录中是有的,就不复传了

    qark, 查找几个安全相关的Android应用程序漏洞的工具.zip

    qark, 查找几个安全相关的Android应用程序漏洞的工具 QARK 费用为英镑/英镑英镑/英镑eview英镑这个工具旨在寻找在源代码或者封装的APKs中的几个安全相关的安卓应用程序漏洞。 工具还能够创建"proof-of-concept"可以...

    PHP-CGI远程代码执行漏洞分析与防范

    CVE-2012-1823出来时据说是...sapi在PHP中的作用,类似于一个消息的“传递者”,比如我在《 Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写 》一文中介绍的fpm,他的作用就是接受Web容器通过fastcgi协议封装

    ThinkPHP v5.0.24 完整版

     ThinkPHP借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等,融合了Struts的 Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作...

    若依后台管理系统 v4.1

    所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台管理系统。那么,现在若依来了。诚意...

    Win64OpenSSL-1_0_2u(win10可用).exe

    OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站...

    opensslWin版

    OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用...

    hscan:集成crawlergo、xray、dirsearch、nmap等工具的src漏洞挖掘工具,使用docker封装运行;使用oneforall自动遍历子域名并扫描;

    本项目已停止维护, 转而维护这个项目; tools下有几个工具,所以项目文件比较大,...使用docker封装,使用参数运行 使用crawlergo爬取网接,传给xray扫描 使用dirsearch遍历目录及文件,传给xray扫描 集成jsfinder、

    Windows x64 的 Openssl 1.1.1 安装包msi

    OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站...

    vue富文本编辑器组件vue-quill-edit使用教程

    之前使用的富文本编辑器是uEditor,kindEditor,感觉不太方便。 近期项目vue单页面,就使用vue-quill-edit这个编辑器组件吧! 一、安装 cnpm install vue-quill-editor 二、引入 ... import VueQuillEditor from 'vue-...

    ThinkPHP框架任意代码执行漏洞的利用及其修复方法

    最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布... 封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现.   然而近期th

    opentsdb-java-sdk:用Java语言封装了openTSDB的http api

    opentsdb-java-sdk目前实现的功能查询数据,支持同步和异步写入数据,支持异步回调删除数据查询最新数据查询metric、tag_key和tag_value,支持auto_complete`源码中CrudTest类提供了一些使用说明和测试,包括并发...

    fastdfs-6.x(Docker版本)

    因漏扫中发现Fastdfs低版本存在安全漏洞(Nginx版本过低),此外fastdfs与Nginx版本属于强依赖关系,因此只能将版本进行整体升级,再经过Dockerfile进行编译封装新版本镜像,经测试此版本不存在安全漏洞问题。...

    harbor.txt

    Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm...

Global site tag (gtag.js) - Google Analytics