ColdFusion 11 - 500非ASCII Cookie字符的内部服务器错误

T S*_*ift 9 cookies coldfusion tomcat jwplayer coldfusion-11

为了响应任何包含非ASCII字符的cookie的请求,ColdFusion 11似乎崩溃了.IIS 8.5返回HTTP 500内部服务器错误(空白页).

重现步骤:

  1. 在Javascript控制台中运行以下命令并尝试加载任何CFML页面: document.cookie="a=ñ";

  2. (可选)请求任何.html或.txt文件并接收正常响应.

  3. 请求任何ColdFusion页面并收到空白页,HTTP 500内部服务器错误.

  4. 唯一的解决方法是清除浏览器cookie.

环境:

  • Windows Server 2012 R2标准版
  • IIS 8.5
  • 冷融合11(标准)
  • 所有操作系统和软件都运行最新的修补版本.

我已经尝试添加-Dfile.encoding=UTF-8Java参数.

我没有在ColdFusion上找到其他人遇到这个问题.在Tomcat上运行Java代码存在类似的问题.但是,由于ColdFusion 11与Tomcat捆绑在一起,我甚至不知道Tomcat的运行版本以及如何升级它.(看起来ColdFusion 10运行Tomcat 7)Adobe似乎没有关于ColdFusion 11的Tomcat层的文档(特别是它与ColdFusion的关系).我已尝试将<CookieProcessor />配置应用于context.xml,如其他帖子所示.我已发布到Adobe bug基础并且未收到任何响应.

欢迎任何想法.不幸的是,我们在cookie中有很多用户使用"Español",我们无法执行任何ColdFusion代码来清除或更改它.我们在ColdFusion 9中没有遇到这个问题,并且在升级到ColdFusion 11之后在QA检查中错过了这个问题.

coldfusion-error.log完全例外:

Sep 03, 2015 11:43:58 PM org.apache.coyote.ajp.AjpProcessor process
SEVERE: Error processing request
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
    at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:193)
    at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:502)
    at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:349)
    at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:168)
    at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:106)
    at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:986)
    at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:743)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:417)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:199)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    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)
Run Code Online (Sandbox Code Playgroud)

Jam*_*erg 4

您可以使用 IIS 重写规则识别非 ASCII cookie,然后将用户重定向到静态 HTML 页面并删除或重写 cookie。(我使用 CF10 对此进行了测试,它有效。)

\n\n

此非 ASCII cookie 会杀死 ColdFusion10/11。(注意:ColdFusion 只能访问大写的 cookie 名称。)

\n\n
document.cookie="a=\xc3\xb1";\n
Run Code Online (Sandbox Code Playgroud)\n\n

将此添加到您的 IIS web.config 文件中。

\n\n
<rule name="Route Bad Cookie" enabled="true" stopProcessing="true">\n  <match url="^(.*)" />\n    <conditions logicalGrouping="MatchAll">\n      <add input="{PATH_INFO}" pattern=".*htm$" negate="true" />        \n      <add input="{HTTP_COOKIE}" pattern="([^\\x00-\\x7F]+)" />\n    </conditions>\n  <action type="Redirect" url="/clearCookie.htm" redirectType="Temporary"/>\n</rule>\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:上述规则匹配除“.htm”文件之外的任何脚本(如果您已使用 IIS 重写来隐藏 URL 中的 .CFM)。

\n\n
  <match url="*.cfm*" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您有安全意识,您可以将该rewrite操作替换为abort.

\n\n
<action type="AbortRequest" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

或自定义响应:

\n\n
<action type="CustomResponse" statusCode="403"\n  statusReason="Forbidden: Invalid non-ASCII cookie"\n  statusDescription="Only US-ASCII characters excluding CTLs, whitespace,\n  DQUOTE, comma, semicolon, and backslash are allowed in a cookie." />\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是删除 cookie 的一些示例代码 (/clearCookie.htm):

\n\n
<script>\nvar mydate = new Date();\nmydate.setTime(mydate.getTime() - 1);\ndocument.cookie = "a=; expires=" + mydate.toGMTString();\n</script>\n
Run Code Online (Sandbox Code Playgroud)\n