- PR -

PDFファイルダウンロード時のキャッシュ

投稿者投稿内容
たれぱん
会議室デビュー日: 2007/10/10
投稿数: 7
投稿日時: 2007-10-15 18:28
はじめまして。WEB系のシステム初心者です。
ASP.NETで開発しています。
PDF(アクロバット)形式のファイルをレスポンスオブジェクトを使い
画面に出力した場合、クライアントマシンにキャッシュ?が残ってしまいます。
セキュリティの関係で、キャッシュを残したくないのですが、
よい方法はございませんでしょうか?
(ブラウザの設定で、というのはなしで)
PDFファイルを直接画面に表示させるため、
レスポンスオブジェクトに対して"no-cache"等設定しても効果がないようです。


れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-10-16 02:43
引用:

PDF(アクロバット)形式のファイルをレスポンスオブジェクトを使い
画面に出力した場合、クライアントマシンにキャッシュ?が残ってしまいます。



「キャッシュ?」の「?」の意味するところはなんでしょうか?

まず、当たり前の話から。
キャッシュを残すのはクライアントで、
サーバー側にそれを強制的に禁止する能力はありません。
できるのは、残さないように指示することだけです。

引用:

セキュリティの関係で、キャッシュを残したくないのですが、
よい方法はございませんでしょうか?
(ブラウザの設定で、というのはなしで)



ですので、クライアントを設定できないのでしたら、
キャッシュを残さないことはセキュリティ向上に関して、
気休めでしかありません。

もちろん技術者には、その気休め分も気にして欲しいですし、
気にすべきですが。

引用:

PDFファイルを直接画面に表示させるため、
レスポンスオブジェクトに対して"no-cache"等設定しても効果がないようです。



効果がないとは、キャッシュされるということですか?
前述のように、キャッシュの保存はクライアントに依存しますので、
効果がなかった環境を明記してください。

私の手元の環境ではno-storeで正しく動いています。たぶん。

最近はどうだかわかりませんが、
昔はno-cacheやno-storeを指定するとpdfが開けませんでした。
(http://support.microsoft.com/kb/812935/ja)
IISやクライアントでその対策が打たれてるというような事情はありませんか?
たれぱん
会議室デビュー日: 2007/10/10
投稿数: 7
投稿日時: 2007-10-16 09:10
返信ありがとうございます。

環境は、VisualStudio2005 で開発し、IE6.0 SP2 で確認しています。

コードに、
Response.AddHeader("cache-control", "no-store, no-cache, must-revalidate")
をつけた場合には、
私がやろうとしている「PDFファイルを直接画面に表示」の動作をしなくなり、
「ファイルをダウンロードしますか?」というダイアログが開いてしまいます。

他に、
Response.AddHeader("Pragma", "no-cache")
Response.Expires = -1
等を記述した場合には、キャッシュに残ってしまいます。

記述方法が間違えているのかな、と思いいろいろ試してみたんですが、
それでもキャッシュが残ってしまいます。

Response.CacheControl = "no-cache"
Response.AddHeader("Cache-Control", "no-cache")
Response.AddHeader("Expires", "-1")
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.Cache.SetAllowResponseInBrowserHistory(False)
Response.Cache.SetExpires(DateTime.Now)

なにかお気づきの点がありましたら、ご教授下さい。
よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-16 21:57
キャッシュを残さないようにした、次の段階の話ですが。

ご要望は、「何が何でも、クライアントに残さない」のように理解しました。
ところで、「ユーザが保存すること」は、どのように制御するおつもりですか?
# 転じて、「キャッシュだけ残さないようにして意味がありますか?」
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-16 22:35
引用:
Response.Expires = -1
等を記述した場合には、キャッシュに残ってしまいます。

常に最新のものを見せたいというだけであれば、この1行でキャッシュを見に行かなくなると思います。
(別のページにいって[戻る]した場合、新たにリクエストしにいく)

そうじゃなくてローカルに保存されることがだめ、ということであればJittaさんのおっしゃるように
意味がありますか?ということになります。第一、ローカルにファイルとして存在していないファイルは
見れないんじゃなかろうかと思います。
#ちょい前のIEはpdfとかを開くときキャッシュしてないと「ファイルがありません」とか言われたような
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-10-16 23:24
引用:

Jittaさんの書き込み (2007-10-16 21:57) より:
# 転じて、「キャッシュだけ残さないようにして意味がありますか?」



キャッシュはユーザーが意識しないうちに残りますから、
消せるなら消せるで、セキュリティ上意味はあります。
ユーザーが消したつもり、ダウンロードしなかったつもりのものが残ってるわけで、
流出したら恥ずかしい場合もあるでしょう。
効果の多少はありますが、確実に有意です。
その為にわざわざRFCでno-storeが定義されたくらいですから。


そのRFCには、"MUST NOT store"と明確に書かれています。

引用:

たれぱんさんの書き込み
記述方法が間違えているのかな、と思いいろいろ試してみたんですが、


コードをいろいろ試すのもいいですが、
クライアントの動作が問題なので、
パケットキャプチャを使って、サーバーの出すHTTPパケットを見てください。
きちんとno-storeが送られていますか?

きちんと送られている場合、キャッシュに残ったとすると、それは非互換動作です。
IEやIISにHTTP1.1互換の動作を期待するのは当然だと思いますので、
とりあえずMSにフィードバックですね。
私ならその後は、客なり上司なりに、
「努力をしたがIEのバグでダメ」と言って逃げます。
対策はあるかもしれませんが、
あまり変な対策を打って、後で困るのもいやですから、
RFCに従った振舞いでとめておきます。

サーバーから、no-storeが送られていないなら、
ASP.NetかIISの何処かでヘッダが消えてしまってるわけです。
ASP.Netの設定とIISを疑いましょう。

no-storeが付くと、意図しない動作になってしまう場合、
つまり、「ダウンロードしますか?」と聞かれてしまう場合は一番大変です。
もちろん、キャッシュにないとpdfが開けないってことなんでしょうが、
対策が無いのか、調べないとダメです。

私は知りません。(今は調べる気力と環境がありません。)
pdfってダウンロードしながら見れたはずなので、
キャッシュになくても見れそうなもんだなぁと思うんですが。

偉い人待ちですね。
誰か教えてください。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-10-17 11:33
引用:
意味がありますか?ということになります。第一、ローカルにファイルとして存在していないファイルは
見れないんじゃなかろうかと思います。

私、嘘をついたみたい。
http://support.microsoft.com/kb/812935/ja
ここにあるレジストリ操作をすると、キャッシュせずに、直接開いて、みることができました。
(うちはEI6SP2)

引用:
pdfってダウンロードしながら見れたはずなので、
キャッシュになくても見れそうなもんだなぁと思うんですが。

れいさんが正しいようです。
たれぱん
会議室デビュー日: 2007/10/10
投稿数: 7
投稿日時: 2007-10-18 09:34
返信ありがとうございます。

まず、キャッシュを残したくない理由は、
れいさんのおっしゃるとおり、ユーザーが
意図しないうちにファイルがローカルに存在していた、
ということを避けるためです。
保存は、ユーザーが自身がアクロバットの「コピーを保存」というボタンで、
保存するようにしたいと思っています。

次に、コードに
Response.AddHeader("Cache-control", "no-store")
を追加してみました。
すると、「このファイルをしますか」ダイアログが表示されてしまいました。
ベルさんの教えてくださった方法はまだ試していませんが、
レジストリを操作すれば、ダイアログが表示されなくなるということでしょうか?

あと、私が試した方法で、
まず、空白のページを表示し、そのページに「no-Cache」のコードを記述しておき、
このページに対して、PDFファイルを直接表示させるようにすれば、
PDFファイルのキャッシュは残らないようでした。

スキルアップ/キャリアアップ(JOB@IT)