【问题标题】:How to protect string from hacking如何保护字符串免受黑客攻击
【发布时间】:2014-02-05 17:50:15
【问题描述】:

谁能告诉我应该在 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"
    }
}

【问题讨论】:

  • 你认为答案是什么?这是面试题吗?如果我们做对了,我们能得到这份工作吗?
  • "如何停止黑客攻击?"第一步是承认你有问题......
  • 请参阅 this question 以获取 SecurityManager 解决方案。

标签: java string reflection immutability


【解决方案1】:

只需使用适当的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)

这只是使用默认策略(启用安全管理器时),但您也可以指定自定义策略。

【讨论】:

    【解决方案2】:

    您可以向String 对象添加校验和,每当从对象请求字符串时,都会检查该校验和。然而,这只会检测到变化。

    一旦您通过比较其校验和与存储的校验和检测到值的内部存储已更改,您就有多种机制可用于恢复原始值。

    因为大部分现有代码都假定String 是不可变的,所以这些都不太可能在真实系统上运行。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2019-05-22
      • 1970-01-01
      • 2016-02-06
      • 2011-01-31
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多