【问题标题】:ColdFusion 11 - 500 Internal Server Error from Non-ASCII Cookie CharacterColdFusion 11 - 500 来自非 ASCII Cookie 字符的内部服务器错误
【发布时间】:2015-10-22 19:24:36
【问题描述】:

在响应任何使用包含非 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 上遇到过这个问题。有similar issues 在Tomcat 上运行Java 代码。然而,由于 ColdFusion 11 与 Tomcat 捆绑在一起,我什至不知道运行的是什么版本的 Tomcat,也不知道如何升级它。 (看起来 ColdFusion 10 运行 Tomcat 7) Adob​​e 似乎没有关于 ColdFusion 11 的 Tomcat 层的文档(特别是它与 ColdFusion 的关系)。我已经尝试将<CookieProcessor /> 配置应用于context.xml,正如其他帖子中所建议的那样。我已发帖到Adobe bug base 并没有收到任何回复。

欢迎任何想法。不幸的是,我们有很多用户在 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)

【问题讨论】:

  • 请报告给bugbase.adobe.com
  • 非 ASCII cookie 是否有效?我认为只有不包括 CTL、空格、DQUOTE、逗号、分号和反斜杠字符的 US-ASCII 字符是有效的。 stackoverflow.com/a/1969339/693068 你能写一个 IIS 规则来识别它并清理它吗? CF 的 OWASP 功能能赶上吗?
  • 我为自己尝试测试这个而破坏了 TryCF.com。运行后 document.cookie="a=ñ";没有代码示例会运行。如果您改用 CFCookie,则 cookie 值被安全地编码为“%C3%B1”。
  • 使用 ColdFusion 9 时不存在此错误,但在 CF10 和 11 上已确认。
  • Henry:如原帖所述,它已发布到 Adob​​e 错误库(此后 8 天内没有活动)。

标签: tomcat cookies coldfusion jwplayer coldfusion-11


【解决方案1】:

您可以使用 IIS 重写规则识别非 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 Rewrite 来隐藏 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 2018-12-14
    • 2020-08-23
    • 2018-10-26
    • 2019-01-17
    • 2011-10-17
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多