拉鏈法是解決Hash沖突問題的方法之一,把所有hash值相同的元素鏈接在同一個(gè)單鏈表中。這也是jdk中hashmap,hashtable的實(shí)現(xiàn)方 式。外部拉鏈法的缺點(diǎn)是:它需要稍微多一些的空間來實(shí)現(xiàn),因?yàn)樘砑尤魏卧囟夹枰砑又赶蚬?jié)點(diǎn)的指針,并且每次探查也要花費(fèi)稍微多一點(diǎn)的時(shí)間,因?yàn)樗枰?間接引用逐一查找匹配,而不是直接訪問元素。當(dāng)大量相同hash值的元素保存時(shí),就會(huì)導(dǎo)致鏈表巨長無比,這時(shí)get出對應(yīng)元素時(shí)要在鏈表里比對key是否 相同直到找到對應(yīng)的元素。
在多數(shù)web容器的設(shè)計(jì)中,request都是依靠相應(yīng)語言的hashtable/hashmap實(shí)現(xiàn),當(dāng)不同的key存入時(shí)如果hash值相等則以鏈表 方式連接。此漏洞利用碰撞相同的hash值得到一個(gè)長鏈表,容器從request重新get時(shí),map的計(jì)算過程會(huì)將時(shí)間復(fù)雜度巨增,原來一個(gè)簡單的過程 將變成一個(gè)很費(fèi)cpu的過程。
解決辦法:限制最大請求body大小,限制請求的參數(shù)個(gè)數(shù)