Hatena::ブログ(Diary)

葉っぱ日記 このページをアンテナに追加

2006-08-28

[] IE7 によるファイルアップロード時のフルパスの送信  IE7 によるファイルアップロード時のフルパスの送信を含むブックマーク

Internet Explorer 6 では、<input type="file"> を使用してファイルのアップロードを行うときに、ファイル名をフルパスで送信するため、マイドキュメントなどに置かれてるファイルをアップロードすると、ログインユーザ名がサーバ側に漏洩するという問題がありました*1

例えば、マイドキュメントに置かれているファイルを送信した場合、IEから送られるリクエストは以下のようになります(抜粋)。

POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d611f24420292
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache

-----------------------------7d611f24420292
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\hasegawa\My Documents\test.txt"
Content-Type: text/plain

Content-Disposition として送信しているファイル名中に、Windows へのログインユーザ名である hasegawa が含まれているのが見て取れます。

さて、IE7 では、リリース ノートを見てみると、次のような記述があります。

ファイル選択のコントロール - Input TYPE=FILE コントロールは、完全修飾パスを送信せず、ファイル名のみを送信するようになりました。

これで安心と思いたいところですが、デフォルトでは相変わらずファイル名をフルパスで送信しています。

これを抑制するには、"Internet Option" の "Securit" タブを表示させ、各ゾーンで "Custom level" をクリックし、

Include local directory path when uploading to a server

というオプションを "Disable" に変更してやる必要があります*2。これで、ファイルをアップロードした場合にファイル名がフルパスで送信されることはなくなります。

POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d611f24420292
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache

-----------------------------7d611f24420292
Content-Disposition: form-data; name="file1"; filename="test.txt"
Content-Type: text/plain

…が、マイコンピュータゾーンからファイルをアップロードした場合には、ファイル名がフルパスで送信されるようです。

以下、実験。インターネットゾーンでのファイル送信時にフルパスを送信しないように、"Include local directory path when uploading to a server" を Disable に設定します。次に、以下のような HTML をマイコンピュータ上に作成します。

<html><html><body>
<form method="post" action="インターネットゾーンのURL" enctype="multipart/form-data">
<input type="file" name="file1">
<input type="submit">
</form></body></html>

IE7 でその HTML を開くと、ゾーンがマイコンピュータゾーンとなっていることを確認します。その状態で適当なファイルを選択し、ファイルをアップロードするとファイル名がフルパスで送信されてしまいます。うーむ。

POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d6da325a104fc
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache

-----------------------------7d6da325a104fc
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\hasegawa\My Documents\test.txt"
Content-Type: text/plain

*1参考情報1参考情報2

*2:英語版のIE7 RC1を使ってますので、説明が英語になっていますが、日本語版でも大きな差はないと思います。

佐名木佐名木 2006/08/31 11:08 これは大きな変更ですね。
今までのWebアプリ開発側は、アップロードファイルのファイル名を取得するのには、フルパスで到着したデータを「¥」で分割して....って処理を行っていたものですが、この仕様が普及していけば、怠惰なSEによっては、ファイル名だけで渡されるものと期待してしまうでしょうね。....数年後にファイルアップロード可能なWebアプリサイトで、ディレクトリトラバーサルが多発する予感。
現実化しなければいいけど....