有人可以告诉我应该在String类API中进行更改(我们不能这样做),以便下面的程序应该打印“Earth”吗?或
我们怎样才能停止打印“太阳”?如何阻止黑客入侵?
public class StringAPI {
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set("Earth", "Sun".toCharArray());
System.out.println("Earth"); // prints "Sun"
}
}
答案 0 :(得分:6)
只需使用适当的security manager启动JVM即可防止反射。您应该在一个非常严格的安全管理器下运行您不信任的代码。
您无需更改String
课程 - 只需在更紧凑的环境中运行即可。如果您无法像这样控制环境,那么无论如何您都无法强制执行自己的“自定义”String
课程。
举个例子:
c:\Users\Jon\Test>java -Djava.security.manager StringAPI
Exception in thread "main" java.security.AccessControlException: access denied
("java.lang.RuntimePermission" "accessDeclaredMembers")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkMemberAccess(Unknown Source)
at java.lang.Class.checkMemberAccess(Unknown Source)
at java.lang.Class.getDeclaredField(Unknown Source)
at StringAPI.main(StringAPI.java:5)
这只是使用默认策略(启用安全管理器时),但您也可以指定自定义策略。
答案 1 :(得分:0)
您可以向每次从对象请求字符串时检查的String
对象添加校验和。但这只能检测到变化。
一旦检测到值的内部存储已通过比较其校验和,存储的校验和,您就可以使用各种机制来恢复原始值。
现有的代码假定String
是不可变的,因此不可能在真实系统中使用任何内容。
然后再次 - 如果他们也破解了校验和,你仍然被黑了。