有人可以告诉我应该在字符串类API中进行更改(我知道我们不能这样做),以便以下程序应该打印"地球"?或
我们怎样才能停止打印"太阳"?如何停止黑客攻击?
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"
}
}
只需使用适当的安全管理器启动JVM,即可防止反射。你应该在一个非常严格的安全管理器下运行你不信任的代码。
您无需更改String
类 - 只需在更紧凑的环境中运行即可。如果您无法像这样控制环境,那么您很可能无论如何都无法强制执行自己的"自定义"String
类。
举个例子:
c:UsersJonTest>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)
这只是使用默认策略(启用安全管理器时),但您也可以指定自定义策略。
您可以向 String
对象添加校验和,每当从该对象请求字符串时都会检查该校验和。但是,这只会检测到更改。
一旦通过比较其校验和和存储的校验和来检测到值的内部存储已更改,您就可以使用各种机制来恢复原始值。
这些都不太可能在实际系统上工作,因为许多现有代码都假设String
是不可变的。
再说一次 - 如果他们也破解了校验和,你仍然被黑客入侵。