在Java中使用RAW类型的安全含义是什么?
-
29-09-2019 - |
题
我目前正在审查大型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注入的影响。
不隶属于 StackOverflow