[php / http headers] Niet cachen van een bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:09
Ik ben bezig met een opslag systeem voor files in een database. Dat werkt nu helemaal perfect.

Met getfile.php?id=xx kan je een bestand weer uit de database halen. Het php script checked of je bent ingelogd, de juiste rechten hebt, en biedt het bestand vervolgens aan als download. Werkt allemaal prima.

Probleem is echter dat het bestand absoluut niet gecached mag worden, aangezien de info uit de bestanden niet voor iedereen bedoeld is.

Daartoe gebruik ik nu al deze headers:

in mijn security class:
PHP:
1
2
3
4
5
6
session_start();
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate");  
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


en in de getfile.php komt daar nog bij:
PHP:
1
2
3
header("Content-Type: $result[1]"); 
Header("Content-Disposition: attachment; filename=$result[2]");
header("Pragma: public");


Die laatste Pragma: public is nodig om een bug in IE te passeren, die er voor zorgt dat je anders problemen krijgt met het downloaden van files, i.c.m. SSL en sessions. Als ik daar private of no-cache van maak dan doet hij het niet.

Als ik een bestand download en ik kies voor Save-As, dan wordt het bestand niet gecached. Als ik echter kies voor open, dan komt hij toch gewoon in de cache terecht. Heeft iemand enig idee wat ik hier aan zou kunnen doen???

Extra info: bestand kan alles zijn, het gaat nu even specifiek over een word / excel bestand maar dat zou niet uit mogen maken.

Gekke is trouwens dat als ik het zelfde doe met plaatjes waarvoor ik in de getfile alleen deze extra header gebruik er niets gecached wordt, ondanks dat IE het plaatje dan wel automatisch weergeeft en niet ter download aanbiedt.

PHP:
1
header("Content-Type: $result[1]");

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Ik denk dat IE het bestand op een tijdelijke locatie moet bewaren om 'm te kunnen laten openen door een component (zoals een Office document editor). Hij moet het bestand dus wel opslaan.

Plaatjes kan IE echter zelf laten zien; daarvoor hoeven ze niet eerst van uit geheugen naar een bestand geschreven te worden (juist bij voorkeur niet; dat is alleen maar omslachtig). Deze bestanden komen dus niet op de harde schijf terecht.

Het zou goed kunnen dat IE de bestanden dus inderdaad niet cached: bij een volgend verzoek wordt het bestand gewoon opnieuw opgeladen. Dat er een tijdelijk bestand achterblijft op de schijf staat daar los van.

Dit is duidelijk een 'probleem' dat veroorzaakt wordt door het gebruik van Internet Explorer in combinatie met de manier waarop plug-ins werken. Een portable oplossing is er dus niet. Ik heb ook geen idee of (en hoe) het op te lossen is; waarschijnlijk moet je als gebruiker het bestand gewoon niet in de browser openen als je niet wil dat er een tijdelijk bestand wordt geschreven. Dit komt overeen met een gebruiker die 'Save As...' doet, het bestand opent, en daarna vergeet te verwijderen. Helemaal voorkomen kun je dat dus toch niet.

Vanuit een meer principieel standpunt lijkt client side security me vooral een punt voor de client side. Als het tijdelijke bestand wordt weggeschreven naar een locatie die alleen voor de desbetreffende gebruiker beschikbaar is (en eventueel na uitloggen verwijderd wordt) is er immers niets aan de hand. Het is daarom waarschijnlijk het handigst om de situatie zo te laten en eventueel een waarschuwing te plaatsen over het gebruik van Internet Explorer.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Als je op netwerkstions werkt met bijv win 2000/nt gebruikers dan zal alleen de admin misschien in die bestanden kunnen komen, de rest van de gebruikers heeft de cache op gebruikersniveau, en daar kunnen de anderen niet bij.

Op win98, ME en andere thuissyteempjes zal het echter wel een probleem worden. Programma's als word, en excel openen alleen bestanden door de url mee te geven, dus bijv c:\test.doc. Word opent dan dat document, het moet dus ergens opgeslagen staan. Wat ik je nu aan zou raden in doormiddel van de FTP mogelijkheden het bestand openzetten voor de gebruiker zodat deze het zo kan openen vanaf de server. Als je dan de autosave mogelijkheden van word uitschakeld werk je geheel in het geheugen, de swap-file even daarbuiten gelaten ;-)

[ Voor 3% gewijzigd door djluc op 29-12-2002 17:37 . Reden: /me wordt vervangen door de parser ]