顺便 说一下,这里解决方法的要点是重用所有现有的 HashMap(如 ConcurrentHashMap 等),而不是完全重新发明轮子。使用随机散列函数的语言(如 Perl)可以防止这种攻击。
鉴于最近和毁灭性的 DDoS 在几个 hashmap 实现中使用已知缺陷(已知会影响 Java 网络服务器,但也影响 PHP 和其他),Apache Tomcat 刚刚推出了一个补丁形式的“修复”,允许将POST 请求中允许的最大参数数量上限(将您的 Tomcat 修补到 6.0.35+ 或 7.0.23+ 顺便说一句)。
(D)DoS 显然基本上使用了这样一个事实,即可以制作字符串,以便它们在散列时确实会发生冲突,并且许多网络服务器“愚蠢地”将键/值参数放入(损坏的)散列图中。
我想知道是否可以在 HashMap{String,String} 周围编写一个装饰器,以便为每个添加的字符串添加一个随机(从被攻击的角度来看是随机的)值添加到字符串中,如下所示:
... get( String s ) {
return wrappedBrokenMap.get( s + crunch(s );
}
... put( String key, String value ) {
wrappedBrokenMap.put( s + crunch(s), value );
}
这将是crunch(...)的一种实现(这只是一个示例,重点是:攻击者不知道实现):
private static final int MY_MAGICAL_NUMBER = 0x42BABE; // attacker doesn't know that number
private static String crunch( String s ) {
return s.length + "" + MY_MAGICAL_NUMBER;
}
如果对于任何 String s crunch(s)返回一个攻击者无法猜到的可重现的 String,那么 DDoS 攻击就被有效地阻止了,对吧?
那行得通吗?