代码之家  ›  专栏  ›  技术社区  ›  Ben S

Java中使用原始类型的安全性含义是什么?

  •  4
  • Ben S  · 技术社区  · 14 年前

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

    List items = new List();
    

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

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

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

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   Powerlord    14 年前

    我想不出任何其他的安全问题。

    对于非安全性影响,泛型类型还为返回泛型的类型在字节码中执行显式强制转换*。当然,这对用户是透明的,并且似乎返回的类型是泛型类型。

    例如:

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

    *这是因为 type erasure .

        2
  •  0
  •   rook    14 年前

    缺乏类型安全可能导致安全问题。例如,假设此列表正用于构建查询:

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

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