Обработка java.lang.IllegalArgumentException: вызвано символом Control в значении cookie

Недавно я развернул веб-сайт, где я храню куки в браузере с именем продукта в качестве значения куки. Но у некоторых продуктов есть управляющие символы в их названии. В результате, когда эти названия продуктов сохраняются в cookie, создается исключение IllegalArgumentException, вызванное символом Control в значении cookie.

 java.lang.IllegalArgumentException: Control character in cookie value or attribute.
        at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:169)
        at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:493)
        at org.apache.tomcat.util.http.Cookies.doProcessCookieHeaderOriginal(Cookies.java:283)
        at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:233)
        at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:141)
        at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1163)
        at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:914)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:532)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

У меня есть идея, что я должен закодировать имя перед сохранением в куки.

Но проблема в том, что многие пользователи, уже столкнувшиеся с проблемой, не могут просматривать сайт.

Существует ли какой-либо способ обработки исключения без изменения значения файла cookie, или есть какой-либо способ удалить старые файлы cookie, которые были проблемными, или любые другие.

1 ответ

Что касается будущих куки, ваше решение просто URL-encode или же Base64-encode значение до установки его в куки, а затем URL-decode или же Base64-decode это при чтении.

Относительно существующих пользователей, которые "отравили" куки, это особенно зависит от дизайна вашего приложения и фреймворков.

Подход может состоять в том, чтобы настроить Tomcat для разрешения таких значений (что может иметь побочные эффекты в зависимости от того, как вы используете фактические значения). Вы можете быть заинтересованы в ALLOW_HTTP_SEPARATORS_IN_V0 или ServerCookie.STRICT_NAMING свойства конфигурации.

Смотрите спецификации здесь http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html для всех настраиваемых свойств.

В зависимости от того, какие символы отправляются ("управляющие символы" немного расплывчаты:)), это может помочь.

Другим решением было бы решить проблему на стороне клиента: просто удалите проблемные куки с помощью Javascript. С Angular Вы можете просто $cookies.remove('toxicedCookie'); Если вы не знаете, какие файлы cookie являются проблематичными, я предлагаю зациклить каждый из них, а при обнаружении управляющего символа удалить его.

Могут быть и другие решения на стороне сервера (например, перехват IllegalArgumentException, проверьте содержимое сообщения и, если оно связано с cookie, удалите cookie), но для этого потребуется более подробная информация о вашем приложении + 2 других вышеупомянутых предложения, вероятно, помогут решить эту задачу проще.

Другое решение (не очень хорошее) - это переключиться на версию Tomcat, которая принимает такие символы (любой Tomcat до 7). Но изменение свойств кота, безусловно, лучший способ достичь этого, безусловно,

Другие вопросы по тегам