4

我目前正在审查大型 Java EE 应用程序中各种警告的安全含义。由于大部分代码都有几年的历史,它包含了原始集合类型的许多用途:

List items = new List();

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

List<Item> items = new List<Item>();

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

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

4

2 回答 2

5

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

对于非安全隐患,泛型类型还在字节码中对返回泛型的类型进行显式强制转换*。当然,这对用户来说是透明的,看起来返回的类型是泛型类型。

例如:

List<Item> items = new ArrayList<Item>();
// .get(int) and remove(int) return Item automatically

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

于 2010-08-17T14:33:19.703 回答
0

缺乏类型安全会导致安全问题。例如,假设这个列表被用来构建一个查询:

"select name from users where id="+items[x]

如果项目包含字符串值,union select load_file('/var/passwd')则攻击者可以读取系统上的任意文件。这是假设您使用 MySQL 的有效负载。如果 items 是整数列表,则此查询不易受到 sql 注入的影响。

于 2010-08-17T16:42:32.110 回答