【发布时间】:2010-12-28 11:22:31
【问题描述】:
最近,我项目的安全团队发布了一份安全代码指南文档,旨在用作我们代码审查的一部分。首先让我印象深刻的是一个项目,上面写着“不要使用内部类”。我认为这似乎是一个非常严厉和笼统的声明。如果使用正确,内部类很好吗?但我做了一些谷歌搜索,发现this,为方便起见,在此引用。
规则 5:不要使用内部类
一些 Java 语言书籍这样说 内部类只能通过 包含它们的外部类。 这不是真的。 Java字节码有 没有内部类的概念,所以内部 类由编译器翻译 进入碰巧的普通班级 可以访问同一代码中的任何代码 包裹。规则 4 说不要依赖 关于包的保护范围。
但是等等,情况会变得更糟。一个内 类可以访问 封闭外部类,即使这些 字段被声明为私有的。和 内部类被翻译成 单独的班级。为了允许这 单独的类访问字段 外部类,编译器静默 将这些字段从私有更改为 包范围!已经够糟糕了 内部类是暴露的,但它是 更糟糕的是编译器是 默默地推翻你的决定 将某些字段设为私有。不要使用 内部类,如果你能提供帮助的话。 (具有讽刺意味的是,新的 Java 2 doPrivileged() API 使用指南 建议您使用内部类 编写特权代码。那是一个 我们不喜欢的原因 doPrivileged() API。)
我的问题是
- 这种行为在 java 5 / 6 中是否仍然存在?
- 考虑到除了外部类和内部类之外的任何试图访问外部类的私有成员的类都无法编译,这实际上是否存在安全风险?
- 是否构成足够的安全风险来警告“准则”“不要使用内部类”?
【问题讨论】:
-
等一下?这是否意味着“我不能使用最流行的方式在 Swing 中创建回调?”
-
如果这确实是贵公司在代码审查期间的安全政策,请及时向dailywtf.com报告贵公司
-
@Zac Bowling:thedailywtf.com,另一个只是一个门口页面。
-
Zac Bowling:特别是 JDK 充满了内部类(正如引用中提到的那样)。
-
代码可见性从未成为一项安全功能。甚至可以使用反射访问私有成员。
标签: java security inner-classes