突然ですが、ここで問題です。以下の二つの文の結果は、同じものであると考えてよいでしょうか?

the_search_query();
echo(get_search_query());

これ、同じと考えては駄目なんですね。異なると考えた人も、ちゃんと異なる結果が返されうる理由を説明できましたでしょうか?これを勘違いしたままWordPressのテーマを書いていると、クリティカルな脆弱性の元になるので、結構重要な問題です。

実は、get_search_query関数の戻り値は、the_search_query関数の出力と異なり、サニタイズがかかっていません。そのため、<?php echo(get_search_query()); ?>というコードがテーマ中に存在すると、script injection攻撃を仕掛けられる危険性があります。攻撃を受けた場合、投稿データなどの全削除すらされ得るでしょう。

パッと思いつく攻撃方法としては、Javascript呼び出しを含むタグを仕込んだ攻撃用検索クエリURLをエンコードしたtinyURLをそれっぽい誘導文とともにコメントとして攻撃対象のBlogに貼り付け、といった具合でしょうか。上手いこと管理権限を保持したままBlogの管理人がそのリンクを踏んでくれれば、管理人に対し任意のスクリプトを埋め込んだ状態で対象サイトを表示させることが出来ます。WordPressで作られたサイトは、普通一般に見せる部分と管理画面とで、ドメインが異なるということがないので、スクリプト実行時のクロスドメイン制約に悩まされることなく、iframeなどを使ってやりたい放題出来るんじゃないでしょうか。

昨日大学の研究会のD1の先輩に、「一般論としてセキュアなコーディングをする上で心掛けることってなんでしょう?」と訊いたところ、「とにかくプログラムの入力に渡されうる値を把握すること」と言われましたが、これもまさに同じことで、WordPressの関数であっても、the_search_query()とget_search_query()は出し方が違うだけで返すデータは一緒だろ―と安易に考えず、ちゃんとサニタイズされているかを確認する必要がありますよ、というお話でした。

ちなみにこの落とし穴、自分でこのサイトのテーマを弄っているときにうまくサニタイズされていないことに気づいたのがきっかけで知ったのですが、WP2.5の時点ではデフォルトテーマでさえ引っかかっていたようです。((;゜Д゜))))