この記事は最後に更新してから1年以上経過しています。
説明
WordPressにはエスケープ処理を行う esc_html関数と esc_attr関数がある。HTML要素(タグ)の属性値ならesc_attr関数を、それ以外はesc_html関数を使うことがほとんどだが、今回esc_html関数が適していないと思われるケースに遭遇した。
HTMLエンティティを含んだ文章をそのまま保持したい
これまで何等かの文章を編集するフォームを作る場合、TEXTAREA要素を使い、文章部分はクロスサイトスクリプティング(XSS)の要因にならないようesc_html関数でエスケープ処理したものを表示していた。
<textarea name="content"><?php echo esc_html( $content ); ?></textarea>
いつもならこれで問題なかったのだが、文章部分にHTMLエンティティを含む場合はそのHTMLエンティティが見た目上は実体になってしまう。例えば上記の$contentの内容が'©'の場合、esc_html関数は'&'を'&'には変換されず、上記のコードは次のように出力される。
<textarea name="content">©</textarea>
仮にこの内容を変更せずにサブミットすると、$_RQUEST['content']の内容は©(UTF-8: 0xC2A9)になってしまい、HTMLエンティティを保持する場合は何等かの前処理が必要になる。
esc_html関数の機能
これまで何気なく使ってきたesc_html関数だが、esc_html関数とPHPのhtmlspecialchars関数(ENT_QUOTESを指定)を比較し、機能を再確認することにした。次の表が2つの関数の返り値の違いとなる。
入力パラメータ | esc_html関数 | htmlspecialchars関数 |
---|---|---|
& | & | & |
< | < | < |
> | > | > |
" | " | " |
' | ' | ' |
< | < | &lt; |
© | © | &copy; |
’ | ’ | &rsquo; |
’ | ’ | &#8217; |
“ | “ | &#008220; |
2つの関数とも上側の5文字はエスケープ処理されるが、下側のHTMLエンティティについてはesc_html関数の方はエスケープ処理されず、htmlspecialchars関数の方はエスケープ処理されるところが大きな違いである。またesc_html関数ではHTMLエンティティに対して余分な0を取り除いている。
今回はhtmlspecialchars関数を使う
TEXTAREA要素の内容や文字を扱うINPUT要素のvalue属性にはHTMLエンティティが含まれる場合があり、それらに変数の内容を設定する際はHTMLエンティティがエスケープ処理されないesc_html関数は適していない場合がある。今作っているプラグインのフォーム内では、HTML要素やHTMLエンティティを含んだ文字列を扱い、HTMLエンティティは常に維持しておきたいため、エスケープ処理はhtmlspecialchars関数を使うことにした。
最終更新 : 2018年10月19日 16:39
関連
お勧め
get_next_image_link(2021年7月25日 更新)
wp_after_insert_post(2020年12月11日 更新)
wp_save_post_revision(2024年1月10日 更新)
wp_debug_backtrace_summary(2012年6月15日 更新)
nocache_headers(2018年5月27日 更新)