2009年2月14日の投稿

2009-02-14
晴れ

HTML エスケープなしの出力は怖い

ゆりこ による 01:13:47 の投稿
カテゴリー: WordPressハック
タグ: ,

Ktai Style 1.61-rc1に同梱した Photolog テーマは、WordPress のメディアライブラリに登録された画像を探して、投稿一覧に貼り付けるという動作をしています。こういう動作は最近人気があるようで(?)、ひろまささんが wp-kougabu に機能追加したりしています。さきほど見つけたのは「WordPressの最新の記事から画像を一覧表示する」というコードでした。

<?php  
query_posts('showposts=10');  
if ( have_posts() ) : while ( have_posts() ) : the_post();  
$files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");  
if (!emptyempty($files)){  
$keys = array_keys($files);  
$num=$keys[0];  
$thumb=wp_get_attachment_thumb_url($num);  
print "<a href=\"".get_permalink()."\" title=\"$post->post_title\">
<img src=\"$thumb\" width=\"80\" height=\"80\" alt=\"$post->post_title\" /></a>\n";  
}  
endwhile;else:  
endif;?>

しかし、このコードを見てびっくりしました。一切 HTML エスケープがされていないからです!! まあ、表示するのは「サイト運営者が入力した情報」である、投稿のパーマリンクとタイトル、画像の URL だけなので、XSS 脆弱性とは言いにくいですが……。ただし、投稿タイトルとして「大阪 -> 京都のきっぷ」というのがあれば、HTML のパースエラーが発生してしまいます。

さて、先方に連絡しようにも、当該の投稿にはコメントフォームがありません。ウェブサイトを見てもコンタクトフォームも連絡先も見つかりません。最後の手段としてピンバックが動作することを期待して、このエントリーを書いたわけです ;-)

素人ならともかく、WordPress のカスタマイズを業務として行なっている方が、こういうコーディングをしてしまうのは不安になってしまいます。HTML エスケープなんて基礎の基礎ですよ!!

さて、改善方法ですが、URL を出すところに WordPress のエスケープ関数である attribute_escape(), clean_url() を使うのがよいですね。post_title を出しているところは、API 関数の the_title_attribute() を使った方がよいでしょう (ただし、事前に global $post; しておくことが必要)。HTML を組み立てるクォート文字列もシングルクォートにしておけば、HTML 内で使うダブルクォートをバックスラッシュでエスケープしなくて済むので見通しがよくなりますね。

print '<a href="' . clean_url(get_permalink()) . '" title="' . 
the_title_attribute('echo=0') . '"><img src="' . clean_url($thumb) . 
'" width="80" height="80" alt="' . the_title_attribute('echo=0') . '" /></a>' . "\n";

WordPress のテクニックをいろいろ公開されるのは素晴しいことですが、こういうセキュリティーの甘いコードを公開するのは困りますね〜〜。せめてツッコミを入れられるようにコメントフォームを開けておいてもらえると助かります。

Ktai Style 1.61 はちょっと延期かも

ゆりこ による 03:49:31 の投稿
カテゴリー: WordPressハック
タグ: , ,

Ktai Style 1.61-rc1 を利用されている方はお気付きかもしれませんが、1.61 正式版は今日を予定していました (HISTORY.ja.html に 1.61 のリリース日として2月14日と書いてあった)。そして、同時に 1.4x 系ブランチもアップデート予定でした。しかし、テスト段階でちょっと大きめのバグが複数発見されたため、今日のリリースは無理で、数日延期になる見込みです。

  • WordPress 2.7 では、コメント投稿時に PHP のエラーが出るもしくは反応がなくなることがありました。コメント時に必須項目がないときエラー文字列を wp_specialchars() でエスケープしていましたが、WordPress 2.7 で配列を入れられなくなったことが理由でした (従来は配列 OK だった)。これは、コメントのテンプレート comments.php の修正が必要なため、自作テーマを作っている方には影響大です。Readme で以下のような修正を案内する予定です。
    (Default テーマでは91行付近; テーマによって implode() で挟む文字列は異なります)

    echo implode("<br />", wp_specialchars(explode("\n", $ks_commentdata['message']))); 

    echo implode("<br />", array_map('wp_specialchars', explode("\n", $ks_commentdata['message']))); 
  • Ktai Style 1.60 が WordPress 2.1.3 以前で正しく動作しないことが判明しました。WP 2.0 にWalker クラスがなく、WP 2.1.x 以前に number_format_i18n(), user_trailingslashit() 関数がないのに無理矢理使っていためです。
  • WordPress 2.0 で、コメント投稿時にコメント本文など必須項目を入力していない場合や、外部サイト接続確認を表示しようとすると PHP のエラー表示もしくは白紙画面になっていました (Ktai Style 1.30 以降が対象)。これは did_action() 関数がないのに無理矢理実行していたためです。WordPress 2.0 でのコメント投稿は正常系のみ試験していたので見つかってませんでした……。
  • WordPress 2.0 では wp_list_bookmarks() が使えないので、rc1 では ks_list_bookmarks() の出力を空にしていましたが、代わりに古いタグである get_links_list() を使うようにしました。

WordPress 2.0 への不具合が多いのは嫌ですね。いちおう動作すると明言している以上、きちんとテストすべきですが、漏れていたのは申し訳ありません。1.4x 系統にもバックポートすべき項目も多く、けっこう手間がかかります。

WP 2.0 + Ktai Style の動作報告がほとんどないのが辛いところです。WordPress 2.0 系統を使っている人がそもそも少なく、まして Ktai Style 利用というのは、かなりマイナーかもしれません。(まだ Otsukare さん版の Mobile Eye のままの人がいる?)

[追記] けっきょく、バージョン番号は 1.70 に変更した上で、2月22日にリリースしました。

NHK は Yahoo! 使い?

ゆりこ による 23:50:00 の投稿
カテゴリー: テレビ・メディア
タグ: , , , ,

Yahoo! で大喜利・ライチンゲール検索結果

きょう配信されたケータイ大喜利メルマガで、「『大喜利・ライチンゲール』で検索すると『ナイチンゲールではありませんか?』と聞き返されるライチンゲールさん。ほんとうにおめでとうございました」というくだりがありました。はて? Google 検索では、そういう表示を見たことがありません。

しかし、Yahoo! 検索を試してみると、見事にそういう表示が出ました!! NHK (のケータイ大喜利スタッフ) は Yahoo! 使いなのかな〜〜。Google で「ライチンゲール」を検索すると、ケータイ大喜利公式サイトが5位まで出てこないのも、何だかなあという気がします。「大喜利 ライチンゲール」だと、5ページ目にならないと出てこないので、NHK ウェブサイトは Google に嫌われているのかも……。