cfwddxでエラーが発生するようになった場合の確認方法

2023年11月に公開されたColdFusion 2023 Update 6、またはColdFusion 2021 Update 12を適用した後に、form変数をcfwddxによるシリアライズした際にエラーが発生するとの報告がありました。

コーディング例

<cfform>
	<cfinput type="text" name="p1" value="#Now()#">
	<cfinput type="submit" name="submit" >
</cfform>

<cfif isDefined("form.submit")>
  <cfwddx action='cfml2wddx' input="#form#" output="wOut">
	<cfdump var="#wOut#">

  <cfwddx action='wddx2cfml' input="#wOut#" output="stOut">
	<cfdump var="#stOut#">
</cfif>

エラー

エラー画面からはWDDXのパケット解析エラーとしか説明されていませんが、「Robust 例外情報の有効化」を有効にしてスタックトレースを表示していると

coldfusion.wddx.DeserializerWorker$InvalidWddxPacketException: 列 85、行 1 の WDDX パケット解析エラーです。 無効な WDDX パケット :root 要素が wddxPacket 内にありません。
	at coldfusion.wddx.DeserializerWorker.validateWddxFilter(DeserializerWorker.java:188)
	at coldfusion.wddx.DeserializerWorker.startElement(DeserializerWorker.java:136)
	at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)


とWddxの検証で発生していることがわかります。

さらに、[cf_root]/{インスタンス(cfusion等)}/logs 内に wddx.logが書き出され、以下のようなメッセージが記載されます

"Information","http-nio-8514-exec-2","11/20/23","11:24:40","","Due to security reasons, coldfusion.filter.FormScope is blocked for deserialization. Add the class/package in the file cfusion/lib/cfserialfilter.txt to override the behavior and allow deserialization"

11月に公開されたUpdateによって、ColdFusionの内部コンポーネントに対するブロックがデフォルトで有効になったことによって、今回のエラーが発生しました。この問題を解消するには、以下のどちらかの方法で対処してください。

  • (方法1)cffilter.txtに”coldfusion.filter.FormScope;”を追加する

8月のUpdate以降にWddxのシリアライズ・デシリアライズの許可リスト(cfserialfilter.txt)が追加されました。

https://helpx.adobe.com/jp/coldfusion/kb/coldfusion-serialfilter-file.html
(ColdFusion シリアルフィルターファイル)

上記の開発元の技術ページにも記載されています通り、[cf_root]/{インスタンス(cfusion等)}/lib 内にcfserialfilter.txtがありますので、そのファイルをメモ帳等テキストエディタで開き、エラーが発生したクラスやパッケージを追加します。今回の場合は、coldfusion.filter.FormScope;を追加します。

  • リスト内の項目と項目の区切りはセミコロン(;)です。
  • リストの末尾に追加する場合も、現時点では必ずセミコロン(;)を付けてください
    java.util.Locale;…(中略)…coldfusion.scheduling.ScheduleTagData

    java.util.Locale;…(中略)…coldfusion.scheduling.ScheduleTagData;coldfusion.filter.FormScope;
    • 初期状態のファイルでは末尾のcoldfusion.scheduling.ScheduleTagDataにセミコロンが付いていませんが、おそらくこれは(現時点では)誤りです

項目を追加した後は、ColdFusionを再起動してください。再起動することで、変更したcfserialfilter.txtの内容が読み込まれます。

 

  • (方法2)ColdFusionの内部コンポーネントをそのままwddxで変換するのではなく、Duplicate関数やStructCopy関数を使って構造体のコピーを作成して、そのコピーに対してwddx変換を行う

プログラムの変更が必要ですが、今回のサンプルプログラムのように、#form#を丸ごとwddx化するのではなく、通常の構造体に変換することで、cfserialfilter.txtの制限を回避します。変更対象のプログラムが少ないようでしたら、こちらの回避の方が早く対処できます。

 


記事公開日:2023年11月21日
最終更新日:2023年11月21日

 


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.