number of cookies sent exceeded the 200

自己用Jfinal4.8做了一个简单的中医参考网站,但是每天都有很多报错。大部分都是
The number of cookies sent exceeded the maximum of 200。
具体异常信息如下:

2020-09-11 09:34:25,ERROR,[Thread: XNIO-1 task-47],[io.undertow.servlet.api.LoggingExceptionHandler.handleThrowable()],UT005023: Exception handling request to /view/zuanlan/13598

java.lang.IllegalStateException: UT000046: The number of cookies sent exceeded the maximum of 200

at io.undertow.util.Cookies.createCookie(Cookies.java:346)

at io.undertow.util.Cookies.parseCookie(Cookies.java:315)

at io.undertow.util.Cookies.parseRequestCookies(Cookies.java:216)

at io.undertow.util.Cookies.parseRequestCookies(Cookies.java:206)

at io.undertow.util.Cookies.parseRequestCookies(Cookies.java:202)

at io.undertow.server.HttpServerExchange.getRequestCookies(HttpServerExchange.java:1128)

at io.undertow.server.session.SessionCookieConfig.findSessionId(SessionCookieConfig.java:84)

at io.undertow.servlet.spec.SessionCookieConfigImpl.findSessionId(SessionCookieConfigImpl.java:61)

at io.undertow.servlet.spec.ServletContextImpl$ServletContextSessionConfig.findSessionId(ServletContextImpl.java:1225)

at io.undertow.server.session.InMemorySessionManager.getSession(InMemorySessionManager.java:215)

at io.undertow.servlet.spec.ServletContextImpl.getSession(ServletContextImpl.java:858)

at io.undertow.servlet.spec.ServletContextImpl.getSession(ServletContextImpl.java:938)

at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:69)

at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)

at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)

at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)

at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)

at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)

at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)

at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)

at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)

at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)

at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)

at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

请问这个如何解决,谢谢!!
另外,我查了F12,只看到hm.js 有些cookie,请问哪里看更多cookie的信息?
blob.png

评论区

JFinal

2020-09-11 10:09

你的网站点击几次就自动创建了很多 cookie, 而且 cookie 的域名是 baidu.com 以及 hm.baidu.com

异常提示是不能超过 200 个 cookie,随着时间的推移,cookie 数量会不断增加,你为啥要用这么多 cookie ?

如下是我随手复制的你网站产生的 cookie:



DRCVFR[dG2JNJb_ajR] mk3SLVN4HKm .baidu.com / Session 31 Medium HMVT 64ecd82404c51e03dc91cb9e8c025574|1599745820| .hm.baidu.com / Session 48 Medium __yjsv5_shitong 1.0_7_09060afb5ce9ef23d8ae8f48ec71e0079e23_300_1599745819959_175.0.57.242_ecc6cfb9 .baidu.com / 2020-09-12T13:50:19.000Z 97 Medium PSINO 7 .baidu.com / Session 6 Medium BDRCVFR[S4-dAuiWMmn] I67x6TjHwwYf0 .baidu.com / Session 33 Medium BDRCVFR[fb3VbsUruOn] rJZwba6_rOCfAF9pywd .baidu.com / Session 39 Medium ZD_ENTRY baidu .baidu.com / Session 13 Medium H_BDCLCKID_SF JRkOVI0-tIvDqTrP-trf5DCShUFsK-viB2Q-XPoO3KOoenkCK4PaLU0JXhrO--biWbRM2MbgylRp8P3y0bb2DUA1y4vpWjKDQ2TxoUJ23UokORQsqqQtqqkebPRiJPb9Qg-qahQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0MD09e5tKD5PVKgTa54cbb4o2WbCQWxnh8pcN2b5oQTtebU4qbt4D0a732PTybb3vOIJTXpOUWfAkXpJvQnJjt2JxaqRCBDLaSp5jDh3MQhDpyxjrelohHGby0hvctn3cShPCyUjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQhjHtOqT-Htn3aQ5rtKRTffjrnhPF3WMRbXP6-hnjy3b7y0bkK-JAaEp5dXbrW5P-UyN3MWh3RymJ42-39LPO2hpRjyxv4X65L3PoxJpOJ3NrZaJQ1HxjtKfnvbURvD--g3-AqBM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE_C0yfI0KhKvPKITD-tFO5eT22-us-57l2hcHMPoosIOvbP4-K4RLLPb3WncObKviaKJjBMbUoqRHXnJi0btQDPvxBf7pBJFD-h5TtUJMsMo_y4jdqq_EqJ7yKMnitIv9-pPKWhQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDjLKD5b3DaRf-b-XbIOyLb5VHJOoDDv6hxbcy4LdjG5x0nOJHRvHbKJn3RndVtb4DxRvblFS3-AqKjJGaKFq-t3tKCD2VqAl2JQkQfbQ0hOhqP-jW5IL-Dok3R7JOpvshfnxyb8UQRPH-Rv92DQMVU52QqcqEIQHQT3m5-5bbN3ut6T2-DA__C-MtD3P .baidu.com / Session 889 Medium BDORZ B490B5EBF6F3CD402E515D22BCDA1598 .baidu.com / 2020-09-12T02:04:55.880Z 37 Medium delPer 0 .baidu.com / Session 7 Medium BDSFRCVID wnCOJeC62GDpt-7rS0CEhLQtr2KKfYcTH6f3Bof6Vwba10QO1yqJEG0Ptf8g0Ku-V2NEogKKLmOTHpKF_2uxOjjg8UtVJeC6EG0Ptf8g0M5 .baidu.com / Session 116 Medium H_PS_PSSID 7540_32606_1437_7546_31660_7611_7625_32117_26350 .baidu.com / Session 58 Medium MCITY -158%3A .baidu.com / 2050-09-10T02:30:04.154Z 12 Medium BIDUPSID 6AEF3EE8528CF9CCAEFCF7A57A4D150E .baidu.com / 2052-07-08T16:22:28.000Z 40 Medium PSTM 1594916429 .baidu.com / 2088-08-03T19:34:36.936Z 14 Medium BAIDUID E12E761325CB6E7A226E2D12E62B1674:SL=0:NR=10:FG=1 .baidu.com / 2050-07-23T13:29:12.000Z 55 Medium HMACCOUNT_BFESS DBF41E2E1085D592 .hm.baidu.com / 2038-01-18T00:00:00.743Z 31 ✓ None Medium HMACCOUNT DBF41E2E1085D592 .hm.baidu.com / 2038-01-18T00:00:00.743Z 25 Medium
mk3SLVN4HKm

rirai

2020-09-11 10:39

谢谢,这一块我不太熟悉,印象中只是在分享的时候用到了百度分享,其他地方都没有用cookie,我再看一下代码吧。再次感谢。

rirai

2020-09-11 13:28

请教波哥,你这些Cookie怎么查看的?我用F12,只看到了hm.js有些cookie,其他的都没有发现有cookie,再次感谢。

rirai

2020-09-12 19:54

不好意思,问题还是没有解决。我把所有可能会产生cookie的代码都给关闭了。但是服务器的log还是一堆一堆的cookie超200的异常。
我反复百度了,只找到一个可能有用的线索,如下:
再次重新审视这一点,我发现,它似乎是一种确定的安全措施。

起初我认为,在特定的时间范围内,只能生成有限数量的cookie,但情况并非如此。如果攻击者试图通过向请求发送大量cookie来攻击您的Web服务器,则会抛出此异常,可能导致缓冲区溢出。

@JFinal 请教波哥,您是否觉得这个是某些攻击?或者有啥好的解决办法吗?谢谢。

JFinal

2020-09-12 21:58

@rirai cookie 有一个过期时间,你这个网站的有些 cookie 的过期时间在几年以后,如果有人在你解决这个问题之前就访问过你的网站, cookie 会一直存在

cookie 是会随着每次请求一起发给你的服务端,异常就会一直有。这个时候已经与你的后端服务无关了,你的后端服务已经解决问题了

你得再观察几天,看是不是异常变少,如果访问者总是同一群人,异常会下降比较慢,如果后续是越来越多的新人访问,异常会逐步下降

JFinal

2020-09-12 21:59

还有一个解决办法是,先找到以前用过的那些 cookie 的 name,然后用一个 jfinal 的全局拦截器,通过下面的代码删掉那些 cookie:
inv.getController().removeCookie(name);

rirai

2020-09-13 15:38

@JFinal 感谢波哥周末深夜回复!!我依法测试一下。再次感谢。

rirai

2020-09-16 08:36

@JFinal 波总,我观察了几天,异常数量没有下降,然后写了一个全局拦截器,但是好像超过200个cookie的时候,undertow直接报错了,没有进入拦截器。
这个问题有啥好的方法吗?是否需要更改undertow 的配置?再次感谢。
代码如下:
Cookie cookies[]=c.getCookieObjects();
logger.info("垃圾cookie数量="+cookies.length);
for(Cookie cookie:cookies){
String name=cookie.getName();
if(!LoginService.sessionIdName.equals(name)){
c.removeCookie(name);
logger.info("删除垃圾cookie ="+ JSONObject.toJSONString(cookie));
}
}

rirai

2020-09-20 11:20

@JFinal 波总,针对这个问题,我查了很多资料,最终觉得还是cookie攻击,解决方法只有通过nginx 防火墙了。在此记录一下,期待以后有人提供更好的方法。
我写的防火墙代码如下:
local ck_list=split2(request_header['cookie'],';')
if ck_list and #ck_list>200 then
write_log('cookie','数量超过200')
return true
end

JFinal

2020-09-21 11:54

@rirai 人家弄这个 cookie 攻击,对你的应用产生了什么实质性影响? 应用当掉了?

rirai

2020-09-23 10:57

好像我这里也没有啥影响,据说有些网站受攻击后,什么溢出之类的问题导致网站宕机,或者数据乱掉之类的吧,undertow这方面还是很强大的啊。

JFinal

2020-09-23 11:17

@rirai undertow 给了报了异常,并没有当机,说明 undertow 可以识别这类攻击, undertow 相当好用