2015-10-22 11 views
8

ASCII以外の文字を含むクッキーに関するリクエストに応答して、ColdFusion 11がクラッシュするように見えます。 IIS 8.5はHTTP 500内部サーバーエラー(空白の白いページ)を返します。ColdFusion 11 - 500非ASCIIクッキー文字からの内部サーバーエラー

手順に再現する:

  1. 実行JavaScriptコンソールで、次のあらゆるCFMLページをロードしよう: document.cookie="a=ñ";

  2. (オプション)リクエストの任意の.htmlまたは.txtファイルと通常の受信応答。

  3. ColdFusionにページをリクエストし、空白のページ、HTTP 500内部サーバーエラーを受け取ります。

  4. 唯一の回避策は、ブラウザのCookieをクリアすることです。

環境:

  • のWindows Server 2012のR2の標準
  • は、IIS 8.5
  • 常温核融合11(標準)
  • 全てのOSやソフトウェアを最新のパッチを適用したバージョンを実行しています。

私はJavaの引数に-Dfile.encoding=UTF-8を追加しようとしました。

この問題をColdFusionで実行している他の人は見つかりませんでした。 TomcatにはJavaコードを実行中のsimilar issuesがあります。しかし、ColdFusion 11はTomcatにバンドルされているので、どのバージョンのTomcatが稼働しているのか、それをどのようにアップグレードするのかは分かりません。 (ColdFusion 10ではTomcat 7が動作しているように見えます)Adobeには、ColdFusion 11のTomcatレイヤーに関するドキュメント(具体的にはColdFusionとの関係)は記載されていません。私は<CookieProcessor />の設定をcontext.xmlに適用しようとしました。私はAdobe bug baseに投稿し、何の応答も受けなかった。

アイデアを歓迎します。残念ながら、Cookieには「Español」というユーザーが多数おり、これをクリアまたは変更するためにColdFusionコードを実行することはできません。私たちは、ColdFusion 9でこの問題を持っているとColdFusion-error.logファイルから

のColdFusion 11へのフル例外アップグレードした後、QAチェックでこれを逃しませんでした:あなたが使用して非ASCIIのクッキーを特定することができました

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

PLSレポート://bugbase.adobe .com/ – Henry

+0

非ASCIIクッキーは有効ですか?私は、CTL、空白、DQUOTE、コンマ、セミコロン、バックスラッシュの文字を除くUS-ASCII文字は有効だと考えました。 http://stackoverflow.com/a/1969339/693068 IISルールを作成してそれを識別してサニタイズすることはできますか? CFのOWASP機能がそれをキャッチできますか? –

+0

私はTryCF.comを壊してこれをテストしようとしました。 document.cookie = "a =ñ"を実行した後。コードサンプルは実行されませんでした。代わりにCFCookieを使用すると、Cookie値は "%C3%B1"として安全にエンコードされます。 –

答えて

3

をIIS書き換えルールを使用してユーザーを静的なHTMLページにリダイレクトし、Cookieを削除または書き換えます。 (私はCF10を使ってこれをテストしました。)

この非ASCIIクッキーはColdFusion 10/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> 

注:上記のルールでは、すでに非表示にするIIS書き換えを使用している場合には(「.htmの」ファイル以外の任意のスクリプトと一致します。あなたのURLでのCFM。)

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

あなたがセキュリティ意識している場合は、abortrewriteアクションを置き換えることができます。

<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." /> 

は、クッキー(/clearCookie.htm)を削除するにはいくつかのサンプルコードです:HTTPSへ

<script> 
var mydate = new Date(); 
mydate.setTime(mydate.getTime() - 1); 
document.cookie = "a=; expires=" + mydate.toGMTString(); 
</script> 
関連する問題