2005-05-20 [長年日記]
_ テーマカスタマイザー (11:28)
昨日の思いつきネタをもうちょっと考えてみる。
基本的には、digital_gadgetsみたいな差し替えやすい背景画像を使ったテーマをベースにして、色味を合わせた好きな画像に変更しやすくしてやるというアプローチ。CSSの解釈順序を考えると、単にそのテーマを選択した状態で、HTML側に記述するCSSで背景画像指定を上書きしてやればそれで済みそう。
背景画像が一番オリジナリティを出しやすいポイントになるが、文字色、背景色等のパターンとして、ベースとなるテーマの色味に対して「ちょっと明るく」「そのまま」「ちょっと暗く」等を指定できるようにしてやると、さらにカスタマイズが効くようになる。こちらも、HTML側でCSS定義を上書きしてやればそれでいいだろう。
あとは、現在選択されているテーマを解析し、背景画像が使われているかどうか、調整可能な要素の色指定要素、などを抜き出して、それらを差し替えるためのインターフェースを用意してやればいい。
って実はすでにそういうのあったりして。
_ ファイルダウンロード処理時のIEの仕様に関する注意点 (13:55)
昔どこかのWikiに関連ログがあったはずだけど、ググってみても見つからないんで、念のためここでまとめておこう。Wikiに添付ファイル絡みの脆弱性が発見された絡みの情報として。
IEはセキュリティ設定の「拡張子ではなく、内容によってファイルを開くこと」を無効にしておかないと(デフォルトでは有効)、content-typeや拡張子よりもファイルの内容の方を優先して処理を行う。
だから、添付ファイルなんかを出力する際に、text/plainとかapplication/octet-streamとかのcontent-typeを使っても、.txtとか.binとかの拡張子をつけても、データ自体にスクリプトが含まれていた場合は、実行されてしまう。具体的には、「テキストデータの先頭からnバイトまでの間にHTMLタグらしきものが見つかったら、HTMLとして解釈する」なんて感じの挙動。
以下のサンプルファイルをIEで開いてみれば、どうなるのかわかる。
- test1.html
- test2.html
- test3.html
- test1.txt
- test2.txt
- test3.txt
- test1.bin
- test2.bin
- test3.bin
- test1.jpg
- test2.jpg
- test3.jpg
test1シリーズは単に「<script>alert('test');</script>」ってだけの内容。IE以外のブラウザでは、.htmlの拡張子のもの以外は、スクリプトが実行されないはず。だけどIEでは、.txt(text/plain)、.bin(application/octet-stream)、.jpg(image/jpeg)という拡張子+content-typeはすべて無視されてスクリプトが実行される。
test2シリーズは、test1の内容の前に無駄なテキスト(数値)を247バイト(改行分は1バイトと数える)つけている。これでもtest1シリーズと同様にIEではスクリプトが動作する。
test3シリーズは、スクリプトの前につけるテキストのサイズを248バイトにしている。こっちはIEでもスクリプトが発動しないはず。おそらくIEは247バイトまでにHTMLタグらしきものが見つからない場合は、text/plainとして扱っているってことなんでしょう。
ただこの境界となるバイト数は、たまたま今手元で試してみた数値ってだけで、ちゃんとした根拠がある数値ではないので、あまり信頼しないで欲しい。
(※追記@2005/5/23 このバイト数に関しては、y-Akiさんのコメントをはじめとする追加情報があります)
というわけで、IEでは正しいcontent-typeをつけても拡張子をつけても、内容としてスクリプトが発動するようなデータだった場合は、スクリプトが発動してしまうので、注意が必要。
ちなみに
Content-Disposition: attachment; filename="foo.txt"
なんてヘッダを指定して、強制的にダウンロードさせる(ダウンロードダイアログを出させる)って手は使えるかもしれないけど、どうも上記指定によるダウンロードって、Windowsのシェル設定(txtのハンドラーを何にするか、とか)によって挙動が変わるっぽいんで、それほど信頼できない気がする。ってのには特に根拠はなく、前にそんなことがあった気がする、程度の情報。
_ もしかしてrecent〜って (22:36)
makerssのデータを使って最近のcommentとかtrackbackを得ているのか? RSSにcommentやtrackbackを出さないようにしようと、makerssのそれっぽいところを削ったら、recent〜に出てこなくなったっぽい。あとコメント後にエラーも出ているな。ひとまず元に戻しておこう。



実際どこまで対応すべきかというのが難しいですね。ここまでやっておけばWikiエンジン側の対応としてはオッケー(?)という線引きも難しそうですし。私はこのへんの知識や経験が足りないので対応しながら勉強中です。
ファイルアップロード関連は、Wikiに限らず、プログラム側で本格的に対策するのはかなり大変なんで、
・デフォルト無効
・クローズドなネットワークでの利用を推奨
・公開ネットワーク上で使用する場合は、権限認証と併用することを推奨
とかした方が無難かもしれません。「FTPアカウントを渡すのと同じように考える」というか。
http://support.microsoft.com/default.aspx?scid=kb;ja;828625
256バイトをスキャンするみたいなので、<script>が256バイトの中に入るかどうかが境目になっているのでは?
http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/moniker/overview/appendix_a.asp
こっちのほうがよいか^^;
おお、そんなところに正確なバイト数が。FindMimeFromDataなんてAPIがあったのか。
そうなると、255バイトまでにHTMLタグらしきもの(開き-閉じタグの組をチェック? 既知のHTMLタグをチェック?)が見つかった場合(&バイナリではなかった場合)、text/htmlと解釈するって感じかなー。
いろいろ試してみたんですが、いくつかのタグの辞書を持っていて、そのパターンを検索しているっぽい気配。<a>とか<em>とかじゃ発動しないけど、<html><head><script>とかHTMLの最初の方に出てきそうなタグだと発動する。あと単純文字列一致でチェックしているっぽいんで、正しいタグじゃなくてもいいみたい。たとえば<htmlllll>とかでも発動するし。