2010-07-14 5 views
2

J'ai trouvé ce que je pense être un gros défaut de sécurité avec le cache d'images Top Sites de Safari. Pour ceux qui ne le savent pas, Safari prend essentiellement un instantané de chaque page que vous visitez et cela est censé être utile à l'utilisateur. Mon problème avec cela est qu'il prend même des instantanés de parties de mon site qui sont protégées par mot de passe. Donc, si quelqu'un tenait un ordinateur de mon utilisateur et savait où chercher, il aurait tout un dépôt de contenu qui devrait théoriquement être réservé aux yeux de mon utilisateur.Empêcher Safari de mettre en cache les meilleurs sites

J'ai testé cette "fonctionnalité" avec d'autres sites et constaté que des sites tels que Gmail et Hotmail ne sont pas mis en cache. Eh bien, seule la page de connexion hotmail est mise en cache, mais rien de plus, et aucun de Gmail n'est mis en cache du tout. Ma question est la suivante: que puis-je faire de mon côté pour éviter que cela ne se produise? Je l'ai déjà bloqué la mise en cache normale dans FF, IE, Opera, etc. en utilisant

header('Cache-control: no-store, no-cache') 

avec Pragma: no-cache, et tous les autres trucs dans le livre d'arrêter une page mise en cache. Ce qui donne?

+0

Il y a une faute de frappe dans mon code: par type de contenu que je voulais dire Cache-control. Pardon. – vince

+1

édité votre message pour refléter ce changement – mdb

Répondre

0

Avez-vous essayé d'ajouter une chaîne de requête aléatoire?

têtes qui devraient fonctionner (tous ensemble):

// A really far back date... 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 

// Dynamic Modified date 
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 

// HTTP 1.0 (i think) 
header('Pragma: no-cache'); 

// HTTP 1.1 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', false); 

EDIT:

Essayez de mettre cela pour un certain débogage après avoir envoyé les en-têtes ci-dessus.

if (headers_sent()) 
{ 
    echo '<h1>Headers sent</h1>'; 
    echo '<pre>'; 
    var_dump(headers_list()); 
    echo '</pre>'; 
} 
else 
{ 
    echo '<h1>Headers not sent</h1>'; 
    echo '<pre>'; 
    var_dump(headers_list()); 
    echo '</pre>'; 
} 

Pouvez-vous modifier votre publication avec la sortie de ce qui précède?

Merci!

+0

J'ai eu les 1ère et 3ème déclarations dans mon code. J'ai ajouté les deux autres que vous avez suggérés mais cela n'a pas fait de différence :( – vince

+0

Avez-vous vérifié quels en-têtes sont réellement envoyés depuis votre serveur? Vous pouvez avoir des etags envoyés, assurez-vous également que vous n'avez pas d'écrasement. Si aucune de ces méthodes ne fonctionne, pouvez-vous joindre le code où vous envoyez les en-têtes? Qu'en est-il de l'ajout d'un nombre aléatoire à chaque page "connectée", en utilisant page.php? cb =

+0

OT, mais n'est pas "echo"

'; var_dump(headers_list()); echo '
'; 'dupliqué dans votre dernier échantillon? Pourrait être retiré de l'if et d'autre et être mis après à la place. – Svish

2

MISE À JOUR: Pour quiconque lit ceci: Ceci est toujours un problème non résolu. J'ai même contacté l'équipe de développement Safari et ils m'ont juste fait courir.

@Kieran Allen

Ceci est le résultat du code que vous me demandiez d'inclure:

Headers sent 

array(7) { 
    [0]=> 
    string(23) "X-Powered-By: PHP/5.2.2" 
    [1]=> 
    string(38) "Expires: Mon, 26 Jul 1997 05:00:00 GMT" 
    [2]=> 
    string(50) "Cache-Control: no-store, no-cache, must-revalidate" 
    [3]=> 
    string(16) "Pragma: no-cache" 
    [4]=> 
    string(40) "Cache-Control: post-check=0, pre-check=0" 
    [5]=> 
    string(44) "Last-Modified: Wed, 14 Jul 2010 09:32:56 GMT" 
    [6]=> 
    string(23) "Content-type: text/html" 
} 

Ma théorie actuelle est que Safari désactive l'instantané sur des sites Web sécurisés utilisant https.

(Je sais que ce n'est pas le bon protocole pour répondre à cette question comme une réponse à ma question, mais quand je l'ai demandé, je n'étais pas un membre enregistré, mais je me suis enregistré dans la dernière heure réclamer cette question comme la mienne mais hélas Stack Overflow ne le permet pas.)

+0

Ouais, pourrait être le HTTPS - je suppose que votre seul moyen de contourner ce serait d'ajouter une chaîne aléatoire à la fin des URLs –

+0

Je ne pense pas que la chaîne aléatoire fait une différence ... Après avoir testé quelques autres sites, j'ai trouvé que facebook aussi faire ne pas être mis en cache (en dehors de la page de connexion). Facebook n'est pas exactement un site sécurisé, donc je me demande ce qu'ils font pour éviter que cela ne se produise. La même chose vaut pour myspace. – vince88

+0

Ce message m'a beaucoup aidé. Pourquoi? Parce que, j'ai passé hier à essayer d'empêcher la mise en cache de safari et je me suis juste rendu compte que la "sauce spéciale" est "HTTPS". Cela n'aurait pas été signalé comme un bug si testé sur HTTPS. Je suis assez ennuyé mais soulagé. Cela devrait être la meilleure réponse. –

0

L'envoi de 2 en-têtes de contrôle de cache n'aide probablement pas - essayez de les fusionner. Je recommande également un en-tête 'Vary: Cookie' comme bonne pratique pour les pages authentifiées.

Avez-vous regardé les en-têtes que vous obtenez des pages hotmail et google qui, selon vous, ne sont pas mises en cache?

C.

1

This site is all you want

if ($_SERVER["HTTP_X_PURPOSE"] == "preview") { 
    // Do something for safari top sites 
} else { 
    // Do something for all navigators 
}; 
Questions connexes