检测Java反射

检测Java反射,java,reflection,detection,Java,Reflection,Detection,如果我有一个游戏,我想检测是否有人在某些类中反射字段,我该怎么做?我知道他们必须将字段设置为可访问 有人告诉我,我无法检测是否有人加载了我的类并正在使用反射访问字段 我想知道是否可以创建一个线程来不断检查someField.isAccessible()是否返回true 这是一个好方法吗?行吗?它在我自己的类中工作,但是如果有人创建一个类来加载我的jar并获取字段,它会工作吗?他们必须将它设置为可访问的,这就是为什么我问这是否是一个好方法 有什么想法或建议吗?如果他们真的想做,你不能阻止他们做这些

如果我有一个游戏,我想检测是否有人在某些类中反射字段,我该怎么做?我知道他们必须将字段设置为可访问

有人告诉我,我无法检测是否有人加载了我的类并正在使用反射访问字段

我想知道是否可以创建一个线程来不断检查someField.isAccessible()是否返回true

这是一个好方法吗?行吗?它在我自己的类中工作,但是如果有人创建一个类来加载我的jar并获取字段,它会工作吗?他们必须将它设置为可访问的,这就是为什么我问这是否是一个好方法


有什么想法或建议吗?

如果他们真的想做,你不能阻止他们做这些事情

即使您的方法有效,他们也可以反编译您的类,进行麻烦的检查,然后编译自己的版本


防止您的软件被“黑客”的唯一方法是不分发它,而是在您自己的机器上运行它(“软件即服务”)。可能是“安全关键”部分的唯一选项。

如果他们真的想做这些事情,你不能阻止他们做这些事情

即使您的方法有效,他们也可以反编译您的类,进行麻烦的检查,然后编译自己的版本


防止您的软件被“黑客”的唯一方法是不分发它,而是在您自己的机器上运行它(“软件即服务”)。可能是“安全关键”部分的唯一选项。

如果您控制代码在其中执行的JVM(托管一些用户提供的代码),则可以安装自定义SecurityManager。如其文档所述,Field.setAccessible将调用已安装的SecurityManager,后者可以通过抛出SecurityException(或记录它或其他方式)否决setAccessible调用。不幸的是,传递给SecurityManager的ReflectPermission对象不包含被授予访问权限的字段,因此不能有选择地拒绝对特定字段的访问。您可以做的是检查调用堆栈(使用SecurityManager.getClassContext())并拒绝访问堆栈中是否有用户提供的代码

也可能有一种方法可以通过默认的SecurityManager实现和策略文件强制执行此操作,但中的所有示例都是关于授予权限,而不是撤销权限。这意味着您必须找出非用户提供的代码所需的所有权限,并提供适当的策略文件。(白名单通常是比黑名单更好的安全策略,但需要更多的努力来建立。)

这一切都是基于JVM安全性实现的,以便按照文档所述工作;正如您可能知道的,有一些基于applet的漏洞利用漏洞逃离JVM沙箱。最好不要在包含敏感信息的同一JVM中运行用户提供的代码,而是依赖操作系统级进程隔离来实现安全性。但是严格地说(“我可以检测setAccessible吗?”)如果您控制JVM,答案是肯定的


如果您不控制代码在其中执行的JVM(您将代码交给用户自己运行),则保护是徒劳的。除了在运行代码之前修改代码以删除保护之外,它们还可以在修改后的JVM上运行,该JVM不会对源于代码的反射操作执行访问检查,或者直接修改您试图保护的任何字段。

如果您控制代码在其中执行的JVM(托管一些用户提供的代码),您可以安装自定义SecurityManager。如其文档所述,Field.setAccessible将调用已安装的SecurityManager,后者可以通过抛出SecurityException(或记录它或其他)否决setAccessible调用。不幸的是,传递给SecurityManager的ReflectPermission对象不包含被授予访问权限的字段,因此您不能有选择地拒绝对特定字段的访问。您可以做的是检查调用堆栈(使用SecurityManager.getClassContext())并在堆栈上有任何用户提供的代码时拒绝访问

还有一种方法可以通过默认的SecurityManager实现和策略文件强制执行此操作,但中的所有示例都是关于授予权限,而不是撤销权限。这意味着您必须找出非用户提供的代码所需的所有权限,并提供相应的策略文件。(白名单通常是比黑名单更好的安全策略,但需要更多的努力来建立。)

这一切都是基于JVM安全实现的,可以按文档所述工作;您可能知道,有一些基于小程序的漏洞利用漏洞逃出JVM沙箱。最好不要在包含敏感信息的同一JVM中运行用户提供的代码,而要依靠操作系统级进程隔离来实现安全。但是严格地说(“我可以检测setAccessible吗?”)如果您控制JVM,答案是肯定的


如果您不控制JVM,代码将在其中执行(您将代码交给用户自己运行),保护是徒劳的。除了在运行代码之前修改代码以删除保护之外,它们还可以在修改后的JVM上运行,该JVM不会对源于其代码的反射操作强制执行访问检查,或者直接修改您试图保护的任何字段。

是的,但我并没有试图阻止注入或之前的操作ent反射。我只是想知道是否有可能检测到“setAccessible(true)”。忽略注入(删除此内容),我会走上正确的轨道吗?是的,但我不是试图阻止注入或阻止反射。我只是想知道是否有可能检测到“setAccessible(true)”无法检测到。忽略注入(删除此内容)