【ColdFusion】encodeForHTML使用時の注意点

encodeForHTML関数を利用していたらエラーと戦うことになったので…

CF11からHTMLEditFormat関数が非推奨となり、
encodeForHTML関数が推奨されるようになったようです。

しかしIIf関数を利用し、
かつ日本語を出力しようとすると下記のエラーメッセージが出力されてしまいます。

終了の # が式にないようです。たとえば、#expr# ではなく #expr になっているようです。

その対策方法についてですが、2点あります。

  1. 三項演算子を利用する
  2. HTMLEditFormatを使い続ける

1.三項演算子を利用する

IIf関数も非推奨になってきているらしく、三項演算子の利用を推奨しているようです。
DE関数と組み合わせて利用しなければいけませんでしたが、
どうやら三項演算子の場合はDE関数は不要で動的に式を評価してくれるようです。

<cfset testFlg = true>
<cfset testString = '<b style="color:red;">あ有A</b>'>
<cfoutput>
    <!--- エンコード結果出力  「&#x3042;&#x6709;A」 --->
    <cfdump var="#encodeforhtml(testString)#">
    <br>
    <!--- 三項演算子使用時 出力結果:あ有A --->
    #((testFlg IS true) ? encodeForHTML(testString) : "テスト")#
    <!--- iif関数使用時にはエラーとなる --->
    <!--- 「#」が含まれている為、エラーになる --->
    #IIf(testFlg IS true, DE(encodeForHTML(testString)), "テスト")#
</cfoutput>

2.HTMLEditFormatを使い続ける

何だかんだでCF2016でもHTMLEditFormat関数は残っているので、
利用し続けるのも一つの手です。
ですが、最初に言った通りでCF11からセキリュティの問題で
encodeForHTML関数の利用を推奨しています。

結局のところ…

HTMLEditFormat関数が更新されるのを信じるか、
HTMLEditFormat関数が廃止されるかもしれないことを考えて先に対応しとくかは
色々と考えておかないといけませんね(:3_ヽ)_

ですが、encodeFor*関連の関数は複数存在しています。
※詳しい使い分けの方法についてはまだ知らないので、気が向いたら検証してみます…

関数名 説明
encodeForHTMLAttribute inputタグ内で利用する?
encodeForCSS CSS用
encodeForJavaScript JavaScript用
encodeForURL URLパラメータ用
encodeForXML XML用

来年はCFとJavaの連携についての記事を充実にしていきたいです(:3_ヽ)_

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です