http://www.warna.info/archives/2476/
わんばんこ。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 1 <?php echo esc_html( get_post_meta( $post->ID, 'meta_key', true ) ); 適用例 2 1 <?php echo esc_html( $_GET['key'] ); ?> esc_attr attr の名前が示すとおり、タグの属性値にかけるエスケープ関数です。でも、ソースコード読むと、esc_html とまったく一緒。でも、将来的に変わる可能性もあるので、ちゃんと使い分けましょうね。 適用例 1 1 <img src="" alt="<?php echo esc_attr( get_post_meta( $post->ID, 'img-alt', true ) ); ?>" /> 適用例 2 1 <input type="text" name="form-name" value="<?php echo esc_attr( get_option( 'form-name', '' ) ); ?>" /> esc_url urlとして不適切な文字列の削除やエンティティ化を行います。 適用例 1 1 <a href="<?php echo esc_url( get_post_meta( $post->ID, 'user_website', true ) ); ?>">Webサイト</a> この他にも、javascriptのサニタイズを行う esc_js や、テキストエリアに用いる esc_textarea (し、知らなかった。)なんていうものもあるようです。