`
ouyangfei0426
  • 浏览: 127508 次
  • 性别: 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 实例对象的状态。

分享到:
评论

相关推荐

    系统封装首席执行官SC封装2.0+工具

    8. **更新与维护**:工具可能包含自动更新功能,确保系统封装过程使用的都是最新的补丁和软件版本,以减少安全漏洞。 9. **日志记录**:为了便于问题排查和日后的优化,SC封装工具可能会记录详细的执行日志,记录每...

    【2021】最新封装免签版苹果APP+文字安装说明

    【2021】最新封装免签版苹果APP+文字安装说明 在移动应用开发领域,尤其是iOS平台,苹果公司对应用的发布有着严格的规范,通常开发者需要通过App Store进行审核才能让应用上线。然而,"封装免签版苹果APP"提供了一...

    变色龙app封装系统源码

    同时,安全编码实践也很重要,避免因修改源码引入新的安全漏洞。 10. **测试与调试**:封装后,需要进行详尽的测试,包括单元测试、集成测试和用户体验测试,确保新功能的正常运行,以及应用的稳定性和兼容性。 11...

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

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

    XML解析封装

    5. 安全性:确保解析过程不引入安全漏洞,如防止XXE(XML External Entity)攻击。 在我们的案例中,"XmlDll"可能是一个包含了XML解析封装的动态链接库。它可能提供了易于使用的函数或类,开发者只需调用这些接口...

    基于SOAP消息组合变异的web服务漏洞测试

    它定义了如何封装信息,以及如何处理请求和响应。 - **组合变异**:指在测试过程中同时改变多个参数,以模拟真实场景下的复杂交互情况。这种方法可以有效发现单个变异无法检测到的漏洞。 ##### 2. 组合测试策略 - ...

    雨林木风封装工具

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

    php漏洞全解与面向对象思维导图

    面向对象编程(OOP)的核心概念包括类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism)。类是对象的蓝图,定义了属性(Attributes)和方法(Methods),对象则是类的...

    WebView的全面使用及封装

    - 关注`WebView`的安全更新,避免使用已知漏洞的旧版本。 通过上述方式,我们可以全面掌握`WebView`的使用,并实现高效、安全的封装。在实际开发中,根据项目需求,可以进一步扩展和定制`WebView`的功能。

    VB 网站漏洞扫描(类似Nessusd)

    可以考虑使用面向对象的设计原则,将每个扫描任务封装为单独的类,以便于管理和扩展。 【挑战与注意事项】 1. **性能限制**:VB在处理大量并发请求时可能会遇到性能瓶颈,可能需要优化代码或使用更强大的网络库。 ...

    仿fir.im APP应用分发系统源码 支持封装免签版苹果APP.rar

    "亲测无后门,随便搭建一下自己封装苹果app吧"意味着源码已经过测试,确认没有安全漏洞,并且用户可以轻松地部署自己的服务来封装和分发苹果应用,而无需经过Apple官方的审核流程。 【标签】"苹果免签,ios免费打包...

    一个封装了安全API调用机制的Delphi类..rar

    2. **参数验证**:通过在调用API之前验证参数,可以防止因无效或恶意输入导致的安全漏洞。例如,确保字符串长度正确,数值类型符合预期等。 3. **安全的内存管理**:API调用可能涉及内存分配和释放,封装类可以确保...

    MySQL封装类

    7. **安全性**:遵循最佳实践,如使用预处理语句防止SQL注入,设置合适的字符集以避免乱码问题,以及定期更新数据库驱动以修复已知的安全漏洞。 在压缩包中的`mysql封装类`文件,很可能是包含了以上所述功能的PHP类...

    多功能组件封装

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

    08_理论8_文件包含漏洞的原理与实践_20180921

    ### 文件包含漏洞的原理与实践 #### 一、文件包含漏洞概述 文件包含漏洞是一种常见的Web应用程序安全漏洞,尤其在使用PHP语言开发的应用程序中较为普遍。这种漏洞允许攻击者通过控制程序中用于指定要包含文件的...

    php-upload封装类上传文件,多单文件上传.zip

    6. **安全性考虑**:在处理文件上传时,应防止恶意文件注入,如通过文件名包含漏洞执行恶意代码。类可能会对上传文件名进行重命名,例如使用时间戳或者随机字符串,以避免冲突和安全问题。 7. **Demo示例**:`demo....

    vulhub漏洞测试靶场

    在Vulhub中,每个漏洞环境都被封装在单独的Docker容器中,这样可以确保测试环境的隔离性和一致性,同时也简化了环境的部署和管理。 5. **学习资源**: "vulhub-master"可能包含了详细的使用指南、漏洞描述、PoC...

    struts2 漏洞利用工具

    7. **struts2漏洞利用工具.tpk**:这可能是一个特定于Struts2漏洞的测试工具,封装在一个Talend数据包中,方便导入到相应环境中运行。 8. **lib**:这个目录可能包含了各种库文件,攻击者会检查这些库是否为易受...

    8种技术教你告别ASP漏洞入侵

    - 防范策略包括:将涉及身份验证的部分封装在服务器端,减少在ASP文件中的明文暴露;为数据库连接使用的账户分配最小权限,只允许执行存储过程,禁止直接修改、插入和删除记录。 2. **验证被绕过**: - 单纯的...

Global site tag (gtag.js) - Google Analytics