わんばんこ。2012 WordPress アドベントカレンダーの3日目をむゆうさん( @anticyborg )と共に担当させていただきます。本当は、アドベントよりおべんt(以下略
WordPress で実現系のコードを紹介する記事は、よく目にしますし、セキュリティに関する関心も高いようですが、意外に基本的な所が抜け落ちているケースが多いように感じたので、テーマやプラグイン開発時に憶えておいて欲しい WordPress 関数、esc_html、esc_attr、esc_url について、つらつらと書いてみたいと思います。
この esc_ なんちゃらは、WordPress 2.8 から導入された関数で、それ以前のバージョンでは、wp_specialchars、attribute_escape、clean_urlと様々な名称であったものが、(おそらくは憶えやすいように)統一的な関数名に改名されたものです。Webには、様々な脆弱性を狙った攻撃方法がありますが、これらのエスケープ処理は、XSS を防ぐためのものですね。
WordPress のテンプレートタグで、そのまま表示を行うものの場合、エスケープなども含めて適切な処理をしてくれますが、カスタムフィールドの入力やURL、フォームなどから受け取る値の出力に関しては、必ずこれらの関数を用いておく必要があります。
特定の人のみしか入力しないから大丈夫とかいうのではなく、普段から表示するものにはエスケープ処理を加えるようにしておき、
- Webサイト管理者によって完全に管理された内容であること
- タグを使う必要性があるもの
である場合でのみ、エスケープを解除するように癖をつけておいた方が、うっかり抜けの少ない安全な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人でもある 水野さん の両巨頭の記事です。
おたのしみに!!
「WordPress を扱う上で憶えておいて欲しい3つのesc #wacja2012」への6件のフィードバック