黑马程序员技术交流社区

标题: 反射与java的安全 [打印本页]

作者: 广驰    时间: 2012-9-21 13:25
标题: 反射与java的安全
本帖最后由 应广驰 于 2012-9-21 13:47 编辑

使用反射可以直接调用很多东西,比如修改私有变量、跳过泛型限定,虽然反射有时候会很方便,这样不就违背了java安全的本质和思想了吗,那么要怎样去处理这些问题呢。
  1. Collection<String> collection = new ArrayList<String>();
  2.                 collection.add("3");
  3.                 collection.add("sdfa");
  4.                 System.out.println(collection);
  5.                
  6.                 Method method = java.util.ArrayList.class.getMethod("add",Object.class);
  7.                 method.invoke(collection, new int[]{132,34,54});
  8.                 System.out.println(collection);
复制代码
比如像这样,我定义的是限定了String类型,但是反射的确实整型数组都可以
作者: 皮卫凯    时间: 2012-9-21 13:27
私有的成员变量都可以调用,叫暴力反射。。。
作者: 刘进朝    时间: 2012-9-21 13:40
Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制:

n          从任意位置到类公共组件的接入

n          类自身外部无任何到私有组件的接入

n          受保护和打包(缺省接入)组件的有限接入

不过至少有些时候,围绕这些限制还有一种简单的方法。我们可以在我们所写的类中,扩展一个普通的基本类java.lang.reflect.AccessibleObject 类。这个类定义了一种setAccessible方法,使我们能够启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛出一个例外。

下面是一段程序,在TwoString 类的一个实例上使用反射来显示安全性正在运行:

public class ReflectSecurity {

     public static void main(String[] args) {

         try {

             TwoString ts = new TwoString("a", "b");

             Field field = clas.getDeclaredField("m_s1");

//           field.setAccessible(true);

             System.out.println("Retrieved value is " +

                 field.get(inst));

         } catch (Exception ex) {

             ex.printStackTrace(System.out);

         }

     }

}

如果编译这一程序时,不使用任何特定参数直接从命令行运行,它将在field .get(inst)调用中抛出一个IllegalAccessException异常。如果我们不注释field.setAccessible(true)代码行,那么重新编译并重新运行该代码,它将编译成功。最后,如果我们在命令行添加了JVM参数-Djava.security.manager以实现安全性管理器,它仍然将不能通过编译,除非我们定义了ReflectSecurity类的许可权限。

希望对你有帮助.
作者: 广驰    时间: 2012-9-21 13:50
刘进朝 发表于 2012-9-21 13:40
Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制: ...

也就是用异常机制来保证它的安全吗??
作者: 刘进朝    时间: 2012-9-21 14:34
可以那么理解.
作者: 广驰    时间: 2012-9-21 14:37
刘进朝 发表于 2012-9-21 14:34
可以那么理解.

那像我上面的代码那样操作集合呢,没有异常啊,这样使用的时候不久会出错么




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2