在Java中使用原始类型有什么安全隐患?

Ben*_*n S 4 java security collections raw-types

我目前正在审查大型Java EE应用程序中各种警告的安全隐患.由于大多数代码已有几年的历史,因此它包含了原始集合类型的许多用法:

List items = new List();
Run Code Online (Sandbox Code Playgroud)

而不是参数化的集合类型:

List<Item> items = new List<Item>();
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一安全含义是在编译时不能对原始类型进行静态类型检查,并且可能导致运行时错误,例如ClassCastException,根据代码中的位置,这可能会导致拒绝服务.

使用我没想过的原始类型还有其他含义吗?

Pow*_*ord 5

我想不出任何其他安全隐患.

对于非安全性含义,泛型类型还在返回泛型的类型的字节码中执行显式转换*.当然,这对用户是透明的,并且看起来返回的类型是泛型类型.

例如:

List<Item> items = new ArrayList<Item>();
// .get(int) and remove(int) return Item automatically
Run Code Online (Sandbox Code Playgroud)

*这是由于类型擦除而发生的.

  • 此外,使用包装的基元(如Integer和Boolean)在转换为其原始等效项时可能会导致NullPointerExceptions.当变量为null时会发生这种情况.虽然没有明确的安全问题,除非您知道,并且您应该按照其记录,这可能会导致未处理的异常暴露您可能通常不期望它们的内部. (2认同)