セキュリティ:カスタムフィールドのデータをエスケープする

雑談

カスタムフィールドを使った最初のお仕事としてWordPressのシングルテンプレートを作成しました。
そのコードに先輩から暖かい丁寧な添削が入ります。
理解するのに恐ろしい時間かかるけど、一つ一つ理解していかねば。
更新日時は教えてもらった日に設定

カスタムフィールドのデータをエスケープ

運用担当者がヘンなデータを入れた場合に
表示が崩れたり脆弱性ができたら大変

ということで、

<?php echo get_post_meta(); ?>

に一手間加えてあげるそうです。

esc_html()を加えるだけっ!

<?php echo esc_html(get_post_meta()); ?>

エスケープってそもそもなんなの?

マークアップ言語やプログラミング言語で文字列を扱う際に、その言語の文法や処理系にとって特別な意味や機能を持つ文字や記号(およびその並び)を、一定の規則に従って別の文字列に置き換えること。

例えば、HTMLはタグの記述に「<」「>」という記号を用いるため、この記号そのものを文字として表示することは本来できない。このとき、「<」「>」という特殊な表記法に置き換えることで、それぞれ「<」「>」と表示することができる。このような置き換え操作・処理のことをエスケープ処理という。

エスケープ処理とは – IT用語辞典 e-Words

あ、そういうことだったのか。
「<」を「<」じゃなくするんだな。うん。

カスタムフィールドの数が多い時の処理にfunction.phpに関数作成

さて、さらに教わった事。
フィールド数が多いと毎回書かなきゃいけなくて面倒。そのために、function.phpにひとつ関数を作ってあげると便利らしい。
(今回は「cf」なんだろう)

function cf($post_id, $fieldname, $single) {
    $cf = get_post_meta($post_id, $fieldname, $single);
    if ($single) {
        echo esc_html($cf);
    } else {
        return $cf;
    }
}

とのこと。
引数はget_post_metaと同じにして、
第三引数の「$single」がtrueだった場合は、取得したフィールドの内容をエスケープ処理(esc_html())してからechoする。
$singleがfalseの場合は、get_post_metaと同じ動きをする。(つまり、$single = true以外で使っても意味がない。)

とのこと。

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

にしたところは、

<?php cf($post->id, 'fieldname', true); ?>

に変更すればOK!

「$single」がtrueだった場合にしたのはなぜだろう?
と疑問でしたが、

$singleは複数の値を入れる事ができ、そのときsingleにfalseを指定すると、戻り値を次のような配列で受けとるらしい。

Array
{
   [0] => これは値1です。
      [1] => これは値2です。
}

だから、falseの時にエスケープしちゃうとちゃんとひっぱってこれないよってことなのかしら?
うーんよくわからない。とりあえず、配列がある時はまたの機会に考えよう。

その他のエスケープ処理

他にもまだエスケープ処理する関数があるらしい。
ざっくり書くと

esc_attr()

HTMLの属性値として出力するとき
※現時点でesc_htmlと同じ処理をするらしい。将来はわからないから今から適切に書きましょうとのこと。

esc_url()

URLとして適切でない文字を除去

参考にした図書

ちなみに↓は全然基礎じゃないと思う(・∀・)