Movable Type の検索機能でうっかり不正アクセスの可能性 ?

http://hxxk.jp/2004/12/19/1859

記事データ

投稿者

望月真琴

投稿日時

2004-12-19T18:59+09:00

タグ
概要

いくつもの条件が必要ですが、 Movable Type の検索機能から、パスワードのクラック等をせずとも機密情報にうっかり到達してしまう可能性があるかもしれませんというお話。

リプライ

8 件のリプライがあります。

記事本文

複数の weblog を作成するということ

Movable Type による weblog を、複数作成するという場合があります。 カテゴリよりももっと大きい範囲での分類を行いたい場合や、それぞれで異なるテンプレートを使いたい場合など、その理由は様々です。

さて、そういった場合における weblog の検索機能についてちょっと考えてみたいと思います。

weblog ごとに検索結果のテンプレートを変更したい

weblog を一つしか作成していない場合、検索結果のテンプレートは install directory/search_tamplates/default.tmpl で制御されます。

これは管理画面のテンプレート一覧には現れないため、検索結果テンプレートをカスタマイズしたい場合はローカルで直接変更を加える必要があります。 そのためか、テンプレートをオリジナルの物に変更している場合でも、検索結果だけはデフォルトのまま、という weblog もたまに見かけます。

では、複数の weblog を作成している場合はどうするのか ? default.tmpl をカスタマイズしただけでは、どの weblog から検索しても同じ検索結果テンプレートになってしまうのではないか ?

サイト全体の検索 - 代替テンプレートを見ると、 weblog ごとに検索結果テンプレートを割り当てる方法が書かれています。 AltTemplate を使って weblog ごとに検索結果のテンプレートを変更にて具体的な手順を解説しています。 また、テンプレートを各 weblog に割り当てるほど区別する必要はないが、スタイルだけは区別したいという場合は、 link 要素で読み込むスタイルシートの名前を styles-site-<$MTBlogID$>.css といった名前にすることや、 <body id="id-<$MTBlogID$>"> と指定して body 要素に id を割り当てるといったテクニックも使えます。

複数の weblog の内容を一斉に検索したい

デフォルトテンプレートの検索フォーム周りを見ると、

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">このサイトの検索</label><br />
<input id="search" name="search" size="20" /><br />
<input type="submit" value="検索" />
</form>

となっています。 これは input type="hidden" name="IncludeBlogs" で送信している MTBlogID の weblog だけを検索するという指定です。

しかし、 install directory/search_tamplates/default.tmpl の方では

<form method="post" action="<$MTCGIPath$><$MTSearchScript$>">

<h3 class="title">Search this site:</h3>
<div class="comments-body">
<input type="text" size="30" name="search" value="<$MTSearchString$>" /> <input type="submit" value="Search" /><br/><br />
<input type="checkbox" name="CaseSearch" /> Match case <input type="checkbox" name="RegexSearch" /> Regex search<br/><br />
</div>

</form>

のように、 IncludeBlogs の絞込みを行っていません。 よって、もし各記事から直接全部の weblog の検索を行いたい場合、各テンプレートの検索フォーム部分から <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" /> の行を削除しておくと良いでしょう。

逆に、一度検索をした後 ( = default.tmpl による検索結果テンプレートを呼び出した後 ) も引き続き特定の weblog のみを検索範囲としたい場合は、 install directory/search_tamplates/default.tmpl の検索フォーム部分に <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" /> の行を追加しておくと良いでしょう。

検索対象とする weblog を指定したい

次に、全部の weblog を検索する必要はないけど、でも複数の weblog に跨った検索をしたい、という場合。 IncludeBlogs を検索時に任意で指定することで実現できます。

<dl>
  <dt>検索対象とする weblog</dt>
  <dd>
    <ul>
      <li><label for="include-weblog"><input type="checkbox" name="IncludeBlogs" id="include-weblog" value="1" />Weblog hxxks</label></li>
      <li><label for="include-mt"><input type="checkbox" name="IncludeBlogs" id="include-mt" value="2" />MT hxxks</label></li>
      <li><label for="include-www"><input type="checkbox" name="IncludeBlogs" id="include-www" value="3" />WWW hxxks</label></li>
      <li><label for="include-memo"><input type="checkbox" name="IncludeBlogs" id="include-memo" value="4" />xxxk memo</label></li>
      <li><label for="include-bookmark"><input type="checkbox" name="IncludeBlogs" id="include-bookmark" value="12" />xxxkmark</label></li>
      <li><label for="include-forum"><input type="checkbox" name="IncludeBlogs" id="include-forum" value="13" />TuneDoc ver.2</label></li>
    </ul>
  </dd>
</dl>

チェックボックスを用いることで、検索範囲を柔軟に指定することができます。 また、 IncludeBlogs ではなく ExcludeBlogs を用いると、「検索対象から除外する」という指定もできます。

非公開の weblog を作成している場合の注意点

これが今回の最も重要なポイントとなる項です。 複数の weblog を作成する動機に、「公開用の weblog と非公開の自分用 weblog 」というものがあった場合に大いに関係してきます。

公開用の weblog とは別に非公開の weblog を作成し、そこに個人的な情報を書き込んでいたり、また完成に至っていない草稿などを置いていたりするかもしれません。 そういった時に、その weblog を設置しているディレクトリに対して BASIC 認証をかけて保護するようなケースが想定されます。 ( というか私がそうしていました。 )

そういった場合に複数の weblog の内容を一斉に検索するようにしていた場合、ディレクトリ自体に BASIC 認証をかけていても、検索結果として表示することは可能という現象が起こります。

BASIC 認証をかけているから大丈夫だろうと、友人の本名や住所やその他多くの個人情報をその非公開 weblog にメモしていたとします。 このとき、検索者が意図していようと意図していまいとに関わらず、検索キーワードがその情報の一部にマッチした場合、その内容をデータベースから取得して認証のかかっていない部分へ検索結果として表示する可能性があるということになります。

対応策としては、初めからそういった情報を Movable Type で管理しないというのが最も有効な策ですが、よんどころない事情で Movable Type で管理しなければならない場合も、もしかしたらあるかもしれません。 その場合、さらに 2 つの対応策が考えられます。

記事を下書き状態にする

下書き状態の記事は検索範囲に含まれないため、検索キーワードの誤爆マッチによる漏洩は防げます。 最も、そこまでするならやはり Movable Type で管理する意義が無くなってしまいますが。

概要を任意の文字で書いておく

記事の概要欄に、例えば Administrator only と書いておき、 default.tmpl の <MTSearchResults> 〜 </MTSearchResults> 内の検索結果を <$MTEntryExcerpt$> で表示するようにすれば、仮に検索キーワードがマッチしても検索結果は Administrator only としか表示されません。

まとめ

何故ここまで細かく書いて説明するのかというと、実際に自分の weblog で色々試している時に、 BASIC 認証をかけているはずの管理用 weblog の内容が検索結果に現れたからでした。 現在は管理用 weblog は対応を施していますが、このことに気付かなければ、秘匿すべき個人情報というレベルではないにしろ、ある程度重要度の高い情報が漏洩してしまっていたのかもしれません。

実際にこういったケースはほとんど無いと思いますが、そういった情報を入手しようという意図の無い閲覧者が、 <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" /> による検索対象の制限をしておらず、また何の疑いも無く BASIC 認証だけに頼って重要な機密情報を WWW に置いて Movable Type で管理している企業等の情報をうっかり得てしまったら ?

厳密に言ってしまえば、悪意の無いままに不正アクセス禁止法に抵触してしまう可能性だってゼロとは言い切れないのです。

または、

これらの条件のどちらかに当てはまれば、パスワードクラックやパスワードの不正入手をすることなく、また悪意のあるなしに関わらず重要な情報を得ることができてしまいます。 デフォルトの検索テンプレートでは、 MTEntryExcerpt を検索結果として表示するようになっているため、記事の先頭部分に重要な情報を記録していると、その可能性は高くなります。 そして、それは アクセス制御機能を有する特定電子計算機に電気通信回線を通じて当該アクセス制御機能による特定利用の制限を免れることができる情報(識別符号であるものを除く。)又は指令を入力して当該特定電子計算機を作動させ、その制限されている特定利用をし得る状態にさせる行為 に該当するのではと思います。 もっとも、この場合はシステムパッケージにデフォルトで含まれている検索機能の穴……と言うよりも仕様によるものなので、該当しないのかもしれません。 データベースの中を検索するため、通常の記事作成で生成されるものに認証をかけていても、検索では出力されるということは自然なことかもしれませんし。 ( この辺りは検索システムや法律に詳しい方の見識を求めたいです。 )

確率としては非常に低いのですが、情報保持者がずさんな情報管理を行っていても、情報にアクセスしてしまった人が実際に摘発された前例がある以上、そういった事が起こらないとは言いきれないと、頭の片隅に留めておいた方が良いかもしれません。

リプライ

8 件のリプライが送られています。

2005-08-23T15:59+09:00 - eleking

はじめまして。MT初心者です。 いろいろ検索していてこちらに辿り着きました。 興味深く拝読させて頂きましたが、その上で不躾ながらずっと疑問に思っていることを質問させて頂いてもよろしいでしょうか。 デフォルトテンプレートから検索フォームを取り出してきて組み込み、動作自体はうまくいっているのですが、記事とタイトルとコメント以外の箇所を検索対象にすることは出来るのでしょうか? 具体的には、「カテゴリーのタイトル」と「カテゴリーの説明」の中の語句を対象にしたいのですが、デフォルトのままでは引っかかってくれません。 &#60;input type=&#34;hidden&#34; name=&#34;IncludeBlogs&#34; value=&#34;&#60;$MTBlogID$&#62;&#34; /&#62; のあたりが何か関係するのかなあ、といろいろ検索していてこちらに辿り着いたという次第です。 もし、何かヒントをお持ちでしたら、いきなりの訪問の上で恐縮ですが、ご教授願えないでしょうか。 よろしければお願い致します。

2005-08-23T23:26+09:00 - 真琴

はじめまして。 perl は詳しくないのですが、私なりに Search.pm を読んでみました。おそらく、下記の部分が検索対象を示しているのだと思います。 sub _search_hit { &nbsp;&nbsp;&nbsp;&nbsp;my(&#36;app, &#36;entry) = @_; &nbsp;&nbsp;&nbsp;&nbsp;my @text_elements; &nbsp;&nbsp;&nbsp;&nbsp;if (&#36;app-&#62;{searchparam}{SearchElement} ne &#39;comments&#39;) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@text_elements = (&#36;entry-&#62;title, &#36;entry-&#62;text, &#36;entry-&#62;text_more, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;entry-&#62;keywords); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if (&#36;app-&#62;{searchparam}{SearchElement} ne &#39;entries&#39;) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my &#36;comments = &#36;entry-&#62;comments; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for my &#36;comment (@&#36;comments) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @text_elements, &#36;comment-&#62;text, &#36;comment-&#62;author, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;comment-&#62;url; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return 1 if &#36;app-&#62;is_a_match(join(&#34;\n&#34;, map &#36;_ || &#39;&#39;, @text_elements)); } 記事本文部を検索する場合は mt_entry フィールドから entry_title ( 記事のタイトル ) 、 entry_text ( 記事の本文 ) 、 entry_text_more ( 追記部分 ) 、 entry_keywords ( キーワード ) が検索対象となり、コメント部を検索する場合は mt_comment フィールドから comment_text ( コメントの本文 ) 、 comment_author ( コメント投稿者の名前 ) 、 comment_url ( コメント投稿者の weblog の URI ) が検索対象となるようです。 この辺りを直接改造すれば、 category_label ( カテゴリの名前 ) や category_description ( カテゴリの説明 ) も検索できるようになると思いますが、 Search.pm に直接手を加えることはお勧めできません。 また、本文などの全文検索と違い、カテゴリの名前や説明はカテゴリ一覧を作ってしまえばいいだけの話なので、検索対象に加えるメリットもあまり無いと思います。

2005-08-24T09:40+09:00 - eleking

早速に詳細なコメントありがとうございます。 大変良く理解できました。 なるほど、Search.pmの中身に検索対象が指定してあるわけですね。 確かにおいそれと僕のようなものが触るわけにはいかなさそうです。別の方法を何か探してみます。大変参考になりました。 ちなみに、これらを検索対象に加えたい理由をご説明しておきます。 実は下記のようなblogを作りかけておりまして、カテゴリとカテゴリの説明に特殊な意味を持たせているのです。 <a href="http://www.eleking.x0.com/ra/blog/">http://www.eleking.x0.com/ra/blog/</a> ラーメンの感想データベース的なことをしようとしているのですが、カテゴリにお店の名前、カテゴリ説明にお店の情報を宛てて、カテゴリ別ページに飛べば、そのお店の情報とこれまでの感想の一覧がまとめて見られるようにしたかったのです。 MTを大して理解もしてないくせに、CMS的使い方を目指してみたのですが、検索の部分でつまづいてしまったというわけです。 また、時折拝見させて頂きますので、よろしくお願いします。

2005-08-24T11:15+09:00 - ちはや(智猫)

>eleking氏 最近流行のtag関連のプラグインを探して、条件に合うモノを使ってみてはどうでしょう? ……うちもカテゴリーアーカイブをやめてしまったので(意味が無く大きいファイルが出来て再構築(投稿時も)負荷が高い&閲覧しても得る情報が少ない)、現在設定しているカテゴリーをtagとして検索できたらと思うんですけど(結果は一緒ですが再構築時の負荷がかからないですし)、小さいBlog日記ですのでそこまでしてもなとプラグインを探しもしてません(苦笑)

2005-08-24T11:23+09:00 - ちはや(智猫)

あとtag関連以外にはkeyword関連も良いかも。

2005-08-24T16:26+09:00 - eleking

ちはや(智猫)様 貴重なご示唆ありがとうございます。 MTtagsプラグインですね。早速調べてみます。 なにかプラグインで解決出来るものはないかなあ、とは思っていたのですが、何に手をつければいいのか、まったくわかりませんでした。 こりゃもうちょっと勉強しなけりゃなりませんね。

2005-08-27T00:25+09:00 - 真琴

なるほどなるほど。そういった名目で構築するのであれば、ちはや(智猫)さんが仰っているように、 entry_keywords ( キーワード ) 部分を用いるようにすれば良いと思います。 entry_keywords なら検索対象にもなりますし。 <a href="http://as-is.net/blog/archives/001019.html">http://as-is.net/blog/archives/001019.html</a> にて公開されている Tagwire Plugin がお勧めです。

2005-12-27T10:15+09:00 - MT カテゴリー名をスタイルシートのidにする < らっぱ王子

Softimage/XSI メモを改装した。エントリーが増えて参照しにくくなっていたので、Movable Typeを使用してみた。これで検索をかけて記事が...

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など