FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

アップローダのDLKeyを考える

アップローダが./index.cgiにあるとして,アップロードファイルを保存しておくディレクトリを./src/とする。

DLKeyの付いていないファイルならばそのまま./src/upld1.zipみたいな感じで適当な接尾辞+通し番号というファイル名で保存しておけばいい。しかし,DLKey付きのファイルを同じような名前で保存してしまうとDLKeyが分からない人間にも簡単にファイルのあるパスが分かってしまうので,普通はファイル名に何らかの工夫をする。たとえば,DLKeyをハッシュ化した文字列をファイル名の一部にするとか。その場合,アップロードしたファイルのパスは./src/upld1_e4907a1a4dcf0a77542879d16a4da2ef5f503c2b.zipみたいな感じになる。

問題は,正しいDLKeyがPOSTされた場合に,いかにユーザーにファイルをダウンロードさせるか。シンプルに実装するなら,前述のファイルへのリンクを含むHTMLを送出してやればいいんだけど,ただのリンクだと当然そのファイルの実体のURLはユーザーにはバレてしまう。もしそのユーザーに悪意があればそのURLをどこかの掲示板に張り付けることも可能なわけで,そうするとDLKeyの分からない人間にもファイルのダウンロードが可能になってしまう。

で,これってスクリプト脆弱性なんじゃないかなあとなんとなく思ったんだけど,冷静に考えると,これはスクリプト脆弱性にはなり得なかった。なぜなら,どんなにスクリプトで工夫したところで,DLKey自体を晒されてしまえば誰でもファイルをダウンロードできるようになってしまうからだ。

仮に正しいDLKeyを知っている人間に悪意があれば:ファイルの実体URLが分からなくても,DLKeyを晒すことによってファイルの機密性を無意味にすることができる。→ゆえに,ファイルの実体URLを隠す隠さないは悪意あるユーザーの行動に影響しない。

仮に正しいDLKeyを知っている人間に悪意がなければ:ファイルの実体URLが分かっても,それをどこかに晒そうとは思わない。→ゆえに,ファイルの実体URLを隠す隠さないは悪意のないユーザーの行動に影響しない。

したがって,スクリプト側ではDLKeyを知っている人間にならファイルの実体URLを教えてしまっても特に問題はない。秘密鍵という仕組み自体に言えることだけど,アップロードを通じてファイルを安全にやりとりしたいなら,DLKeyは信頼のおけない他者には教えてはならない。信頼できない他者にDLKeyを教えた時点で,DLKeyの保証する機密性は意味を成さなくなるのだから。

そういうわけで,OreUploaderのダウンロードページでは普通にファイルの実体URLへのリンクを表示することにした。