甚至我的类的私有成员/函数也可以通过使用setAccessible(true)的反射来访问。有没有办法防止这种来自外部代码的访问?
我在堆栈溢出上读到一些东西,我可以使用SecurityManager来防止applet中的反射(尽管不确定它是如何工作的),但是Android也有类似的机制吗?也许是一个注释或者巧妙的编程?
发布于 2012-11-04 03:14:55
退一步说,您观察到的是安全哲学上的差异,即最初包含在Sun的JVM中的Java执行模型与Android的执行模型之间的差异。
最初的Java VM设计用于这样一种系统,在该系统中,多个相互可疑的应用程序(或Java术语中的“applet”)将同时驻留在单个地址空间中,并在单个VM中运行。因为设计人员不希望一个应用程序能够与另一个应用程序打乱,所以他们费了很大的劲才定义了一个VM内的安全模型,该模型将禁止诸如一个对象接触另一个不同类的对象的私有字段之类的事情。
也就是说,Java库最终在安全模型之外有了各种“逃生舱”。正如您所注意到的,其中之一是反射对象上的setAccessible()。
Android的模型是不同的:Android使用进程作为安全边界和应用程序隔离的单元,而不是像传统JVM那样试图将其嵌入到进程中。这使得整个Java安全模型变得毫无意义,除了它可以帮助应用程序“将其从自身中拯救出来”。也就是说,不让对象插入另一个对象的私有部分是很好的设计,而缺省的Java安全模型正是提供了这一点。
抛开人们修改你的代码的问题不谈,使用Android,作为一个应用程序的作者,你控制着最终在你的应用程序的进程中运行的所有代码。如果您选择包含调用setAccessible()的代码,那是您的事。你可能会搬起石头砸自己的脚,但你肯定不会砸到任何其他应用的脚,因为Android安全模型,就像在进程层运行一样,本质上不会让这种情况发生。同样,使用本机代码将完全脱离Java对象模型,这允许在过程中完全混乱的可能性,但也允许您以比Java更高效的方式表达某些内容。这是一种权衡,但它是每个应用程序开发人员的权衡,并不会特别影响你的手机/设备上发生的任何其他事情。
我知道这不能直接回答你的问题,但我希望它能提供一些有用的背景。
发布于 2012-11-04 01:17:20
有没有办法防止这种来自外部代码的访问?
不怎么有意思。
安卓也有类似的机制吗?
请记住,如果使用得当,ProGuard将混淆您的私有类和方法,以用于您的产品APK构建。这一点,再加上缺乏文档,将使任何人访问这些私有类和方法都很乏味。
发布于 2012-11-04 02:57:37
我不相信你能真正100%地保护你的项目免受恶意用户的攻击。您可以通过对代码进行混淆等操作来使用户更难做到这一点,但仍然可以对混淆后的代码进行反思。
我不相信SecurityManager可以用于你所建议的目的,尽管我可能是错的。
https://stackoverflow.com/questions/13211369
复制相似问题