当社では高度なカスタムフィールドを使用しており、カスタムフィールドでショートコードを使用する必要がある場合があります。phpコードでは、
これらのフィールドの関数。後でフィールドにショートコードを追加したい場合があるため、ほとんどのフィールドで使用しない理由はありません。
また、WordPressコーディング標準ルールでPHPCodeSnifferを使用します。 echo do_shortcode
を使用するたびに、エスケープ警告は表示されなくなります。したがって、do_shortcode
を使用するだけで安全ですか、それとも使用する必要がありますか。 wp_kses_post
さらに?
ベストプラクティスはありますか?
アドバイスをありがとうございます
コメント
- do_shortcodeはエスケープ用ではありません。
- わかりましたが、codesnifferが警告を表示しないのはなぜですか?
- おそらく表示されません。ショートコードレンダリング関数がその出力のサニタイズを担当する必要があるため、警告を表示します。ただし、任意の文字列を関数に渡すことができ、登録されたショートコードが含まれていない場合は、'文字列がまったく変更されないことを確信しています。それは間違いなく一般的な衛生方法ではありません。コードスニファはそれだけのことしかできません。データを適切にサニタイズする方法については、こちらをお読みください。多くの関数がありますが、私がよく使用する関数はesc_attr、sanitize_text_field、esc_urlです。 codex.wordpress.org/ …
回答
WordPressコーディング標準のスニフは、do_shortcode()
を「自動エスケープ関数」として扱います。これは、2015年に次のGitHubの問題で議論されたようです:
https://github.com/WordPress/WordPress-Coding-Standards/issues/167 https://github.com/WordPress/WordPress-Coding-Standards/issues/428
リストに追加されたときに使用された説明は次のとおりです。
これについてVIPサポート(#44195)と話し合いました。 Davidは、別のチームメンバーと話し合った後、HTMLが出力される場所(ショートコードのコード内)をエスケープするため、不要であると述べました。
しかし、私はその理由に同意するかどうかわかりません。次のように使用した場合:
<?php echo do_shortcode( "[liveperson]" ); ?>
ショートコードがハードコードされている場合、エスケープするのはショートコードの出力だけなので、それは理にかなっています。ショートコードコールバックによってエスケープする必要があります。
ただし、あなたの状況では、を使用しています。 div id = “d5e67f5d15″>
は、カスタムフィールドから、ユーザーが指定したテキスト内でショートコードを実行できるようにします。そのテキストはエスケープする必要がありますが、 エスケープする必要がありますが、do_shortcode()
は実際のエスケープを行いません。
したがって、このようなフィールドを処理する安全な方法は、テキストをwp_kses()
または
、許可されていないタグを削除し、 それをdo_shortcode()
に通して、ショートコードをexにすることができます。再度エスケープせずに実行されます。
$text = get_field( "field_name" ); echo do_shortcode( wp_kses_post( $text ) );
コードスニファが報告する内容と報告しない内容に違いはありませんが、少なくともユーザーが入力したテキスト
1つの制限は、esc_html()
を使用すると、ショートコード属性に干渉するため、機能しないことです。このサニタイズは、レイアウトに影響を与える可能性のある不均衡なタグの入力をユーザーが防ぐこともできません。これは、通常、エスケープが役立つことの1つです。この問題に対処するには、force_balance_tags()
を追加できます:
$text = get_field( "field_name" ); echo do_shortcode( force_balance_tags( wp_kses_post( $text ) ) );