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

9

当含有非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
  • Cold Fusion 11(标准版)
  • 所有操作系统和软件都在运行最新的修补程序版本。

我已尝试将-Dfile.encoding=UTF-8添加到Java参数中。

我在ColdFusion上没有发现其他人遇到这个问题。在Tomcat上运行Java代码存在类似的问题。然而,由于ColdFusion 11与Tomcat捆绑在一起,我甚至不知道正在运行哪个版本的Tomcat,也不知道如何升级它。(看起来ColdFusion 10运行Tomcat 7)Adobe似乎没有关于ColdFusion 11的Tomcat层的文档(特别是它与ColdFusion的关系)。我尝试将<CookieProcessor />配置应用于context.xml,如其他帖子中建议的那样。我已经发布到Adobe bug base并没有收到回复。

欢迎任何想法。不幸的是,我们有很多用户在cookie中使用“Español”,我们无法执行任何ColdFusion代码来清除或更改它。在升级到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)

2
请报告至 https://bugbase.adobe.com/。 - Henry
非 ASCII cookie 有效吗?我认为只有 US-ASCII 字符,不包括 CTL、空格、DQUOTE、逗号、分号和反斜杠字符是有效的。https://dev59.com/23I-5IYBdhLWcg3wNla1#1969339您能否编写一个 IIS 规则来识别并对其进行消毒?CF 的 OWASP 功能能否捕获它? - James Moberg
我在尝试测试这个时,破坏了TryCF.com。运行document.cookie="a=ñ"后,没有代码示例可以运行。如果使用CFCookie,则cookie值将安全编码为"%C3%B1"。 - James Moberg
这个 bug 在使用 ColdFusion 9 时不存在,但在 CF10 和 11 上已经确认存在。 - James Moberg
我在 Twitter 上向 @JWPSupport 报告了此问题。他们的插件在保存为 cookie 之前没有编码 UTF8 值。https://gist.github.com/JamoCA/f8586d0dafc462cfd5d1 - James Moberg
显示剩余5条评论
1个回答

4

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

这个非ASCII cookie会导致ColdFusion10/11出现问题。(注意:ColdFusion只能访问大写的cookie名称。)

document.cookie="a=ñ";

将以下内容添加到您的IIS web.config文件中。

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

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

  <match url="*.cfm*" />

如果您注重安全,可以将rewrite操作替换为abort
<action type="AbortRequest" />

或者自定义响应:
<action type="CustomResponse" statusCode="403"
  statusReason="Forbidden: Invalid non-ASCII cookie"
  statusDescription="Only US-ASCII characters excluding CTLs, whitespace,
  DQUOTE, comma, semicolon, and backslash are allowed in a cookie." />

以下是删除cookie的示例代码(/clearCookie.htm):
<script>
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "a=; expires=" + mydate.toGMTString();
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接