投稿一覧画面やプラグイン一覧画面で次の様な警告文が表示されている場合がございます。
ACF — ACF now automatically escapes unsafe HTML when rendered by the_field or the ACF shortcode. We've detected the output of some of your fields has been modified by this change, but this may not be a breaking change.
これは、Advanced Custom Fields 6.2.7以降にアップデートして、その警告に該当する可能性がある場合に表示されます。
もし上記のメッセージがWordpress管理画面で表示されているお客様が注意が必要です。
Advanced Custom Fieldsプラグインとは
Advanced Custom Fieldsプラグイン(ACF)は、投稿画面で入力フォームを増やし、その入力値や選択値を使って表示するだけでなく、値を使った処理を行える様にする為のカスタムフィールドを追加する為のプラグインです。このプラグインについて詳しくは以下をご覧ください。
この警告文が伝えていること
Advanced Custom Fieldsプラグインは、ACF専用のショートコードやACFの内容を出力する為の関数を使う時に、一部のHTMLタグを自動で省く(HTMLエスケープ)仕様に変わりました。この警告は、それに該当する関数がウェブサイトで使われている事がプラグインで検出されたので、重大では無い可能性はあるけど注意する様にという内容です。
この仕様変更について何が行われるのか
Advanced Custom Fieldsは、指定の関数を使ってカスタムフィールドの内容を出力する際に、カスタムフィールドに対して登録されるHTMLコードにおいてscriptタグとiframeタグをセキュリティの為に除去する仕様(HTMLエスケープ)に変わったそうです。
この2つのHTMLタグは、悪意がある目的で使われる可能性があるので、通常の方法では除去する仕様に変更したという事の様です。
scriptタグとiframeタグ
先ずscriptタグは、JavaScriptやVBScriptなどのスクリプト言語をページ内に埋め込む為のタグです。これをページ内のHTMLに記述すると、そのページで使われる動きや動的な処理を実装する事が可能です。但し、ACF公式が言う様に悪意の目的で利用とすれば、そのページにアクセスしたユーザーに対して個人情報を抜き取る(Webスキミング)ようなスクリプトを埋め込む事も可能になります。
続いてiframeタグはインラインフレームタグと言って、ページの中に別のページを表示させる事が出来るHTMLタグです。よく使われるのが、GoogleMapをページに埋め込む際に発行されるHTMLタグがこのiframeタグを使っています。
これも悪用するとすればscriptタグよりも簡単で、ウイルス感染させる為のスクリプトを仕込んだページをiframeタグで読み込んだり、サイトとは全く関係の無いリンクを仕込んだり、まるでサイトの部品の様に違和感のないフォームを表示させて個人情報を抜き取るという事も可能です。
ただ、これらのタグは昨今のウェブサイトでは欠かせないタグであり、Advanced Custom Fieldsで設定したカスタムフィールド経由でなくとも別のプラグインやWordpress自体も同じリスクを持っています。但し、悪意のあるタグを設置する為には、Wordpressの投稿権限がある事が必要なので、必要な対策(本体やプラグインのアップデート、投稿権限のあるIDとパスワードの漏洩対策など)を行っていれば、それほどリスクは高くないと思われます。
今回のAdvanced Custom Fieldsの仕様変更は、Advanced Custom Fields自体を悪意のある目的に利用されるリスクを減らすのが目的と思われます。
影響のあるウェブサイト
上記の通り、カスタムフィールドで登録する内容に直接<script>~</script>を含んだJavaScriptを登録する場合や、インラインフレームを含むHTMLを登録すると影響があります。
弊社のお客様に、カスタムフィールドを使ってJavaScriptを挿入したり、インラインフレームを挿入する様な目的でカスタムフィールドを設置した例はございません。但し、そこに何を登録するかはお客様自身の自由ですので、もしJavaScriptやインラインフレームを挿入していたら、影響を受けます。
本文以外の複数行テキスト入力フォーム(WYSIWYGエディター含む)に次の様な使い方をしていませんか?
GoogleMapのHTMLを登録している
GoogleMapのHTMLはインラインフレームを利用しているので、マップは表示されずに英単語の文字列などが表示されているかもしれません。
インスタグラム発行の埋め込みHTMLコードを登録している
インスタグラム発行の埋め込みHTMLコードは、インラインフレームは利用していませんが、JavaScriptが使われています。<script>と</script>は削除してしまうので、やはり英単語の文字列が表示されます。
Xの埋め込みHTMLコードを登録している
こちらもインラインフレームは利用していませんが、外部JavaScriptの読み込み指定があります。<script>と</script>は削除してしまうので、async src="https:~という様に英単語の文字列が表示されます。
その他ウィジェトを埋め込む、計測タグを埋め込んでいる場合
ウィジェトや計測タグは、JavaScriptを利用している場合が多いです。やはり英単語の文字列が表示されるだけで、そのウィジェトは表示されません。また計測の場合は機能しません。
この仕様変更に対する対策をしていないウェブサイトで、カスタムフィールドに<script>やインラインフレームを登録した場合
上記の様に、何を登録するかはお客様自身の自由ですのでJavaScriptやインラインフレームを登録する事も可能です。
この場合、<script>、</script>や<iframe>、</iframe>を除かれたものが出力されるので、その内容がそのまま表示される事になります。
ページ毎に異なるJavaScriptを挿入するカスタムフィールドを設置しているウェブサイト
お客様が利用する為では無く、弊社が各ページをコーディングする為に、JavaScript専用のカスタムフィールドを設置している場合はございます。但し、この場合<script>~</script>も含めて登録する仕様にはしていません。そこに、スクリプトを登録したら自動的に<script>~</script>で囲む仕様になっています。
カスタムフィールドにGoogleマップ、
SNSなどの埋め込みコード、計測タグを登録したい場合
上記の通り、Advanced Custom Fieldsプラグインの仕様変更によりカスタムフィールドに<script>やインラインフレームを登録する事が出来なくなりました。
ただ以下の回避策があります。こちらの回避策を取りたい方は、有償となりますが当社で対応する事は可能です。ご希望の場合、お見積り致しますのでお問合せください。
警告で指摘されているカスタムフィールドの出力する為の処理を別の処理に変更する
今回使用変更となったAdvanced Custom Fieldsで用意された関数とは別の関数(Advanced Custom Fieldsで用意された関数)を使った処理に修正する事で、回避する事は可能です。
<script>やインラインフレーム登録専用のカスタムフィールドを追加する
<script>やインラインフレーム登録専用のカスタムフィールドを追加して、そのフィールドに対し登録がある場合は自動で<script>~</script>で囲むという処理をする事で、回避できます。但し、表示する場所が固定されてしまうので、自由度が下がります。