我目前正在审查大型Java EE应用程序中各种警告的安全隐患。由于大多数代码已有几年的历史,因此它包含了原始集合类型的许多用法:
List items = new List();
而不是参数化的集合类型:
List<Item> items = new List<Item>();
我能想到的唯一安全隐含是在编译时无法对原始类型进行静态类型检查,并且可能会导致运行时错误,例如ClassCastException
,这取决于代码中的位置,可能导致拒绝服务。
使用我没想过的原始类型还有其他含义吗?
答案 0 :(得分:5)
我想不出任何其他安全隐患。
对于非安全性含义,泛型类型还在返回泛型的类型的字节码中执行显式转换*。当然,这对用户来说是透明的,看来返回的类型是泛型类型。
例如:
List<Item> items = new ArrayList<Item>();
// .get(int) and remove(int) return Item automatically
*这是由type erasure引起的。
答案 1 :(得分:0)
缺乏类型安全可能导致安全问题。例如,假设此列表用于构建查询:
"select name from users where id="+items[x]
如果项目包含字符串值union select load_file('/var/passwd')
,则攻击者可以读取您系统上的任意文件。这是有效载荷假设你使用MySQL。如果items是整数列表,那么此查询不容易受到sql注入的影响。