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

List items = new List();

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

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

我能想到的唯一安全性是,在编译时不能静态地通过静态类型检查,并可能导致运行时错误,例如 ClassCastException 取决于该代码中的位置,可能会导致拒绝服务。

使用我不考虑的原始类型还有其他含义吗?

有帮助吗?

解决方案

我想不出任何其他安全性。

对于非安全性的影响,对于返回通用的类型,通用类型还会在字节码中进行明确的铸件*。当然,这对用户是透明的,看来返回的类型是通用类型。

例如:

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

*这是由于 类型擦除.

其他提示

缺乏类型安全会导致安全问题。例如,说此列表被用来构建查询:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top