刚从温少手中接手维护,很多事宜还不清楚。
因为之前一直负责安全和故障分析方面的工作,所以接手后第一工作是加固 hash碰撞导致攻击的问题。
从客户端传输的json文本给服务端转换成JSON对象时,绝大多数的实现底层都是用hashmap存存储。这比web容器处理post请求的参 数更容易攻击成功。对于request对象中Parameter parser来说,因为有http规范在那儿,x-www-form-encoded下有一个“&”就是一个参数分隔。可以统计&多少就 知道有多少个参数,限制个数就可以解决。
而对于multipart的只要统计boundary的个数也可以限制参数的个数。
但是对于JSON文本,你不能说根据“:”,“,“的个数,因为正常的文本内容主要是以","分隔的。而":"也是很正常出现的。无法根据它们的 多少就认定这是一个很多key的json对象。从http的处理阶段无法做准确判断,只能在json parser上限制某一节点上key的个数,或者直接不让它们产生hash collision.
限制key个数的方案最终无法确定以多少为合适。所以最终从hash collision下刀,因为HashMap一些方法是final的,无法继承,所以COPY了它的源码在需要修改的地方重新实现了一下。加了一个实例字 段的随机数,对于每一个实例有一个独立的随机值,防止从hash算法上倒推出相同hash值的字符串。