大多数 Java JVM 都会受到非常严重的拒绝服务攻击(所有 1.6.0_24 之前的 Oracle/Sun JVM [在撰写本文时尚未推出],而且昨天还没有发布 HotFix,因为例子)。
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/ http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
下列:
curl -H 'Accept-Language: en-us;q=2.2250738585072012e-308' http://example.org
崩溃了lot全球 Tomcat 网络服务器的数量。
我的问题很简单:谁对谁错?
显然getLocale()
称(非常严重)被窃听Double.parseDouble(...)
然后您可以轻松地在 Tomcat 上执行拒绝服务。
是否有错误的实施Double.parseDouble(...)
真的有错吗?
对我来说,真正的问题是 HTTP 规范使用浮点数来实现对我来说看起来不太像科学计算的东西。使用浮点数来处理这样的事情似乎很奇怪:很容易证明不同语言的实现会产生不同的结果。
那么到底是谁的错呢?
Java 的极其蹩脚(bug 10 年来就为人所知)的实现Double.parseDouble(...)
?
HTTP 规范? (请记住,PHP 也遇到了完全相同的错误)。
我可以理解,如果一种语言发生这种情况,你会责怪语言......但是当两种远程语言发生时拒绝服务由于 HTTP 规范规定对浮点数进行解析,因此两种不同的语言都会发生攻击not科学计算应该敲响警钟。
浮点数应该只用于科学计算。如果您没有浮点数也没有 epsilon,那么您就做错了。