如何保护字符串免受黑客攻击

时间:2014-01-16 17:08:45

标签: java string reflection immutability

有人可以告诉我应该在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"
    }
}

2 个答案:

答案 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是不可变的,因此不可能在真实系统中使用任何内容。

然后再次 - 如果他们也破解了校验和,你仍然被黑了。