はじめに
ASP.NETでファイルアップロードのプログラムを作っていたのですが、とある問題に悩まされていました。
それは、アップロードのプログラムをローカルで動作させたときには、アップロードしたファイルのファイル名だけがサーバに送信されるのですが、サーバ機で動かしたとたんに、ファイル名がフルパスで送信されるようになるというものでした。
原因は、サーバ側のプログラムではなく、クライアント側のインターネットオプションのセキュリティ設定にありました。ローカルで動作させたときには、セキュリティゾーンがインターネットソーンだったのに対して、サーバ機で動作させたときには、セキュリティゾーンがイントラネットゾーンになっていました。
インターネットオプションのセキュリティ設定
IEにおいて、ファイルアップロード時に送信されるファイル名は、インターネットオプションのセキュリティ設定にある「サーバにファイルをアップロードするときにローカルディレクトリのパスを含める」の設定によって変わります。
「サーバにファイルをアップロードするときにローカルディレクトリのパスを含める」のデフォルト値は以下のようになっています。
- インターネットゾーン:無効にする(IE8から)
- イントラネットゾーン:有効にする
IE8からはインターネットゾーンのデフォルト値が「無効にする」になった
IE8からはセキュリティ上の理由から、インターネットゾーンにおける「サーバにファイルをアップロードするときにローカルディレクトリのパスを含める」のデフォルト値が「無効にする」になりました。
「サーバーにファイルをアップロードするときにローカル ディレクトリのパスを加える」の設定について、インターネット ゾーンの既定値を無効に変更しました。この変更により、インターネット上にローカルのファイル システムに関する潜在的に機密性のある情報が流出する危険を防止します。例えば、C:\users\ericlaw\documents\secret\image.png をアップロードする場合、Internet Explorer 8 はファイル名である image.png のみを送信します。
2008/7/2 - Internet Explorer 8 のセキュリティ : 総合的な保護
この仕様変更により、インターネットゾーンでファイルアップロードのアプリケーションをIE8で動かした場合には、ファイル名の部分しかサーバに送信されないようになります。