July 23, 2009 1:25 AM
Movable Typeでセキュアに[編集]リンクを設置するTips(追記アリ)
Category:Movable Type > Movable Type 4.2
Tags:Movable Type
Movable Typeでブログ記事からその記事の編集画面に直接移動する手段としては、ブログ記事テンプレート内に[編集]なりのテキストを追加してやってそのリンク先に
<$MTCGIPath$>mt.cgi?__mode=view&_type=entry&id=<$MTEntryID$>&blog_id=<$MTBlogID$>
と設定することでできるのですが、ログインできないとはいえ不特定多数のユーザに管理画面へのリンクを晒したり、場合によっては管理画面が検索エンジンに登録されてしまう自体は避けたいところです。
第2の案としては、MTEntryEditLinkタグを利用する方法があります。このタグを用いた場合は、Movable Typeにログイン済みで、かつそのブログ記事を編集可能なユーザにしかリンクが表示されません。よって第1の案のデメリットを吸収しているのですが、このタグはMTSearchResultsタグのコンテキスト外では機能しません。故に検索結果画面にしか[編集]リンクを設置できませんでした。
では、きっと有志がMTEntryEditLinkの機能を拡張するプラグインを製作しているだろうと思ったら案の定ありました。<MTEntries>~</MTEntries>内でMTEntryEditLinkタグを利用できるようにするものです。
Blosxom and Movable Type Flavours, Mods and Plugins
http://brutalhugs.com/flavours/
しかしこのプラグインは、ブログのデータがmt.cgiと同ディレクトリ、もしくはそのサブディレクトリ以下に展開されている場合のみしか機能しません。その上ウェブページのソースを見ると、Javascriptのコードで管理画面へのリンクが丸見えになってしまっているので根本的な解決方法とはいえません。
要するにユーザを認証して、リンクを表示させればいいんだろ。ということなのですがまだ未熟な僕には自前ではそんな仕組みは作れません。と困っているところにこんなページを見つけました。
[the girlie matters] tips and tricks: edit link for entries with PHP
http://www.thegirliematters.com/tips/archives/0210/edit_link_for_entries_with_php.php
PHPを用いた方法です。このエントリーを抄訳して紹介します。
まず最初に、以下のようなページを作ってください。このページでCookieを発行します。(yourdomain.comをあなたのサイトのドメイン名で書き換えてください。wwwは必要ありません)
<? setcookie ('edit', "", time() - 3600); setcookie('edit',password,time()+(86400*365),'/'); setcookie('edit',password,time()+(86400*365),'/','yourdomain.com'); ?>Cookieをセットするために今作ったページを閲覧してください(引用者注記:白紙のページが表示されます)
次に[編集]リンクを挿入するための以下のコードを、表示させたい位置に追加してください(もしブログ記事テンプレート(エントリーアーカイブテンプレート)以外のテンプレートに表示させたい場合は<MTEntries>~</MTEntries>内に追加してください)。私は<$MTEntryTitle$>のすぐ後に追加しました。
<? $edit_link = '<a href="<$MTCGIPath$>mt.cgi?__mode=view&_type=entry&id=<$MTEntryID$>&blog_id=<$MTBlogID$>" target="_new">[edit]</a>'; if ($HTTP_COOKIE_VARS['edit'] == 'password') { echo $edit_link; } ?>ページを再構築して、もしあなたのブラウザにCookieがセットされていれば[編集]リンクがあなたのページに表示されていることでしょう。もしCookieがセットされていなければ表示されません!
以上です。Cookieをセットするページを第3者が類推することができなければ、[編集]リンクは人の目には触れないで設置することができる、ということになります。この方法はページがPHP化されていることが前提ですが、htmlの状態でも、小粋空間: Movable Type の PHP化(その2:.html のままPHPを有効にする) のページを参考にすることで可能です。実際僕はその方法で行いました。
参考になれば幸いです。では!(突っ込み待ちです。)
もっともっとシンプルでセキュアな方法(追記)
WolaWolaのOscarさんに情報を提供していただきました。(Thx!! :-))
Ogawa::Memoranda(改めOgawa::Buzz)の小川さんの方法です。
Ogawa::Buzz: "Edit This" Bookmarklet
http://blog.as-is.net/2004/12/this-bookmarklet.html
ブックマークレット(ウェブブラウザで作動するJavaScript)を用いた方法です。リンク先の記事には「簡単"Edit This" Bookmarklet生成」と銘打ったフォームが用意されてるので、ぜひ利用してみてください。Movable Typeのブログ記事テンプレート(エントリー・アーカイブテンプレート)のコメントフォームのソースでは、input要素に隠し属性として「entry_id」の値を定めています。その値を見つけ出してやって管理画面にアクセスする、という仕組みです。

もっと、自分の記事に自信持っていいと思うよ。
小川さんの方法は、ウェブページにはそのまま適用できな(想定外な訳です)かったりします。
Oscarさん、ありがとうございます!
でいけそうですね!記事中のPHPを用いた方法なら、ウェブページにも
小川さんのブックマークレットの方法でもPageIDをページ中から探し出せればいけるのかな?