WordPress を扱う上で憶えておいて欲しい3つのesc #wacja2012

わんばんこ。2012 WordPress アドベントカレンダーの3日目をむゆうさん( @anticyborg )と共に担当させていただきます。本当は、アドベントよりおべんt(以下略

WordPress で実現系のコードを紹介する記事は、よく目にしますし、セキュリティに関する関心も高いようですが、意外に基本的な所が抜け落ちているケースが多いように感じたので、テーマやプラグイン開発時に憶えておいて欲しい WordPress 関数、esc_htmlesc_attresc_url について、つらつらと書いてみたいと思います。

この esc_ なんちゃらは、WordPress 2.8 から導入された関数で、それ以前のバージョンでは、wp_specialchars、attribute_escape、clean_urlと様々な名称であったものが、(おそらくは憶えやすいように)統一的な関数名に改名されたものです。Webには、様々な脆弱性を狙った攻撃方法がありますが、これらのエスケープ処理は、XSS を防ぐためのものですね。

WordPress のテンプレートタグで、そのまま表示を行うものの場合、エスケープなども含めて適切な処理をしてくれますが、カスタムフィールドの入力やURL、フォームなどから受け取る値の出力に関しては、必ずこれらの関数を用いておく必要があります。
特定の人のみしか入力しないから大丈夫とかいうのではなく、普段から表示するものにはエスケープ処理を加えるようにしておき、

  1. Webサイト管理者によって完全に管理された内容であること
  2. タグを使う必要性があるもの

である場合でのみ、エスケープを解除するように癖をつけておいた方が、うっかり抜けの少ない安全なWebにできます。(この場合でもstrip_tagsを用いて、特定のタグだけ許可した方がいいですね。)

特に昨今は、カスタムフィールドを用いて、表示する項目が多くなってきていますので要注意ですよ。

esc_html

Webページ上で表示する文字列に対し、タグとして認識される < > のエスケープや、& などの特殊文字のエンティティを行います。

適用例 1

<?php echo esc_html( get_post_meta( $post->ID, 'meta_key', true ) );

適用例 2

<?php echo esc_html( $_GET['key'] ); ?>

esc_attr

attr の名前が示すとおり、タグの属性値にかけるエスケープ関数です。でも、ソースコード読むと、esc_html とまったく一緒。でも、将来的に変わる可能性もあるので、ちゃんと使い分けましょうね。

適用例 1

<img src="" alt="<?php echo esc_attr( get_post_meta( $post->ID, 'img-alt', true ) ); ?>" />

適用例 2

<input type="text" name="form-name" value="<?php echo esc_attr( get_option( 'form-name', '' ) ); ?>" />

esc_url

urlとして不適切な文字列の削除やエンティティ化を行います。

適用例 1

<a href="<?php echo esc_url( get_post_meta( $post->ID, 'user_website', true ) ); ?>">Webサイト</a>

この他にも、javascriptのサニタイズを行う esc_js や、テキストエリアに用いる esc_textarea (し、知らなかった。)なんていうものもあるようです。

明日の WordPress Advent Calendar は、WordPress の適当王 星野さん( @khoshino )と、日本語チームの1人でもある 水野さん の両巨頭の記事です。
おたのしみに!!