`

暴露属性不安全?

    博客分类:
  • java
阅读更多
我们在看书的时候常常看到书上说暴露属性不安全,那么请问下哪里不安全呢?不安全在何处呢?
上网查了些资料,似乎看不出网上说的那些有何不安全。
IBM网站的一篇文章(您的 Java 代码安全吗 — 还是暴露在外?-->限制对变量的访问)写道:因为变量为 public 的,所以它暴露了。将其改成以private修饰,用get/set赋值的方式来使之安全的代码。

文章链接:
http://www.ibm.com/developerworks/cn/java/j-staticsec/index.html

即使你禁止掉了在子类中用this.name = name;来改变从父类继承过来的name属性值,可你还是可以在子类中用从父类继承过来的setName()方法改变从父类继承过来的name属性值。

百度知道中的一篇文章写道:get/set方法也不一定只是简单的作一个赋值,或一个返回值吧,在这里可以作一些权限的控制,比如不是每个角色都可以赋值的。再比如返回的值不一定是值本身,可以是经过处理了的,比如加密,这用public定义是不能作到的。

文章链接:
http://zhidao.baidu.com/question/115580824.html

在get/set中是可以做一些处理,但这和安全无关,我们取到值后也一样可以做这些处理。不是吗?

网上对这个问题的资料不多,以下是我研究暴露属性不安全的一点,欢迎大家一起讨论。

class Parent {
public String name = "PARENT"; //暴露属性
public void fn() {
System.out.println(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Son extends Parent {
public String name = "SON"; //暴露属性
public void fn() {
System.out.println(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

public class Test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("TEST1:");
Parent s = new Son(); //通常以父类或接口编程
System.out.println(s.name); //注意:取得的是父类属性值
System.out.println(s.getName()); //这才是期望值
s.fn();
System.out.println();

System.out.println("TEST2:");
s.name = "A"; //不安全,改变的是父类属性值,子类属性值并没有改变
System.out.println(s.name);
System.out.println(s.getName());
s.fn();
System.out.println();

System.out.println("TEST3:");
s.name = "PARENT"; //把设回初始状态
s.setName("A"); //安全,改变的子类属性值
System.out.println(s.name);
System.out.println(s.getName());
s.fn();
}
}
/**OutPut
TEST1:
PARENT
SON
SON

TEST2:
A
SON
SON

TEST3:
PARENT
A
A
*/

Java的框架一般都是以接口(Interface)编程,这是为了通用性。而接口中定义的属性都默认是public static final的,根据上面例子,当实现类向上转型到接口,就不能直接把值赋给属性(因为接口的属性是final的),而要用set方法
interface P {
String name = "Bruce";
void setName(String name);
String getName();
}
class S implements P {
private String name = "Phil";
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class Test {
    public static void main(String[] args){
    P p = new S();
    //p.name = "Phil"; //The final field P.name connot be assigned
    p.setName("Phil");
    System.out.println("P.name=" + p.name);
    System.out.println("S.name=" + p.getName());
    }
}
/**OutPut
P.name=Bruce
S.name=Phil
*/
分享到:
评论

相关推荐

    行业分类-设备装置-当请求第三方属性证书时排除口令暴露的方法和系统.zip

    标题“行业分类-设备装置-当请求第三方属性证书时排除口令暴露的方法和系统”涉及到的是一个专门针对设备安全、身份验证以及第三方证书请求的问题。这个问题的核心是防止在获取第三方属性证书时用户的口令或敏感信息...

    面向铁路信息网络的资产安全属性量化评估方法.docx

    面向铁路信息网络的资产安全属性量化评估方法是确保铁路信息系统安全的关键步骤。随着铁路信息化的推进,信息系统在各个业务领域的核心地位日益凸显,其安全风险直接影响到铁路的正常运营和社会稳定。因此,对信息...

    C-中属性和字段(变量)的区别

    5. **接口形式**:属性可以作为接口的一部分出现,这允许在不暴露内部实现细节的情况下,对外部提供数据访问。 6. **基于属性的索引**:属性可以被用作索引来访问数组或集合中的元素,这种基于属性的索引器提高了...

    excel文件属性内容批量自动清除

    "Excel文件属性内容批量自动清除"这个话题正聚焦于如何确保Excel工作簿的敏感信息不被泄露。Excel文件通常包含多种属性信息,如作者、创建日期、最后编辑时间等,这些信息可能在无意间暴露出文件的来源和处理历史。...

    全安全的属性基认证密钥交换协议.pdf

    单调访问结构保证了权限的不可降级性,增强了系统的安全性。 综上所述,全安全的属性基认证密钥交换协议通过利用先进的密码学技术,如CP-ABE和NAXOS,以及创新的访问结构表示方法,实现了更高级别的安全性、灵活的...

    ActiveX控件属性页容器.rar

    因此,开发者应当谨慎处理控件的权限设置,确保只暴露必要的属性,并且对用户的输入进行验证,以防止攻击。 总结来说,"ActiveX控件属性页容器"是Windows编程中的一个重要概念,它是管理和配置ActiveX控件属性的...

    读取属性文件连接数据库

    此外,由于密码等敏感信息不在代码中暴露,这也有助于提高系统的安全性。 在实际项目中,为了进一步提高安全性,可能会使用更高级的方法,如加密属性文件、使用环境变量或系统属性来存储敏感信息,甚至利用容器提供...

    sharepoint 2010 扩展webpart自定义属性边栏字段

    - 当添加自定义属性时,确保处理好权限和安全性,因为这些属性可能会暴露敏感信息。 - 在设计自定义属性时,应考虑用户体验,确保字段易于理解和操作。 - 测试是关键,确保在不同环境中都能正确显示和保存自定义...

    C#属性区别

    在C#中,属性通过get和set访问器实现,使得开发人员可以在不暴露内部字段的情况下,对外部提供一种可控的访问机制。这种机制不仅增强了代码的安全性,还提供了额外的功能,如在获取或设置属性值时执行某些操作。 ...

    属性和索引器教学

    属性允许我们在不暴露内部实现细节的情况下,为类的外部提供数据的读取和写入。属性通常由getter和setter方法组成,分别用于获取和设置值。 ```csharp public class MyClass { private int myValue; // 私有变量 ...

    恢复文件夹隐藏属性专用工具

    其中,隐藏属性使得文件或文件夹在常规视图下不显示,只有在特定设置下(如查看隐藏文件和文件夹)才能看到。这种特性有时用于保护敏感信息,但也可能被恶意软件利用来隐藏其活动。 恢复文件夹隐藏属性的过程通常...

    WEB开发安全漏洞修复方案 (2).pdf

    在Web开发中,安全是至关重要的,因为不安全的代码可能导致数据泄露、用户信息被窃取,甚至整个系统的瘫痪。随着互联网技术的发展,攻击者利用各种漏洞发起的攻击手段也在不断进化,因此,开发者必须时刻保持警惕,...

    实验四 访问属性.docx

    在面向对象编程(Object-Oriented Programming, OOP)中,封装是其核心概念之一,旨在通过隐藏对象内部状态和细节来保护数据的安全性,并通过提供公共接口来实现对外的功能暴露。本实验旨在帮助学习者深入理解OOP中...

    Swift遍历类属性改.zip

    由于Swift的强类型特性和安全机制,直接通过反射(reflection)来获取类属性并不像Objective-C那样直接。然而,通过Swift的runtime库,我们仍然可以实现这一功能。本文将详细介绍如何利用`class_copyPropertyList`方法...

    R15 33501中文版 5G 系统安全架构和过程.pdf

    安全架构概述部分主要描述了5G系统中各个安全实体的作用以及它们在不同安全域内的定位,包括但不限于5G核心网络周边的安全实体和5G核心网络中的安全实体。 在安全要求和功能章节中,列出了5G系统所需满足的安全要求...

    python里运用私有属性和方法总结

    3. **封装**:私有属性和方法的核心思想是封装,即隐藏类的实现细节,只暴露必要的接口给外部使用,这有助于提高代码的安全性和可维护性。 总之,虽然Python中并没有严格的`private`关键字来实现真正的私有性,但...

    mprop改属性工具

    4. **安全与风险**:修改系统属性,尤其是开启`ro.debuggable`,会增加系统的暴露程度,因为可调试状态可能会让恶意软件更容易分析和攻击系统。因此,仅在必要时使用此工具,并确保在调试完成后及时恢复默认设置,以...

Global site tag (gtag.js) - Google Analytics