Php 防止Safari缓存顶级站点

Php 防止Safari缓存顶级站点,php,caching,safari,Php,Caching,Safari,我发现Safari顶级站点的图像缓存存在一个很大的安全漏洞。对于那些不知道的人来说,Safari基本上会为你访问的每个页面拍摄一张快照,这对用户来说应该是有用的。我的问题是,它甚至可以对我的站点中受密码保护的部分进行快照。因此,如果有人掌握了我用户的一台计算机,并且知道到哪里去找,他们就会拥有一个完整的内容库,理论上,这些内容应该只供我的用户查看 我与其他网站一起测试了这个“功能”,发现Gmail和hotmail等网站没有缓存。好吧,只有hotmail登录页面被缓存,但除此之外没有其他内容,Gm

我发现Safari顶级站点的图像缓存存在一个很大的安全漏洞。对于那些不知道的人来说,Safari基本上会为你访问的每个页面拍摄一张快照,这对用户来说应该是有用的。我的问题是,它甚至可以对我的站点中受密码保护的部分进行快照。因此,如果有人掌握了我用户的一台计算机,并且知道到哪里去找,他们就会拥有一个完整的内容库,理论上,这些内容应该只供我的用户查看

我与其他网站一起测试了这个“功能”,发现Gmail和hotmail等网站没有缓存。好吧,只有hotmail登录页面被缓存,但除此之外没有其他内容,Gmail也没有任何内容被缓存。所以我的问题是:我该怎么做才能防止这种情况发生?我已经通过使用阻止了FF、IE、Opera等中的正常缓存

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

还有pragma:无缓存,以及书中阻止页面被缓存的所有其他技巧。给出了什么?

您是否尝试附加随机查询字符串

应一起工作的标题:

编辑:

在发送上述标题后,尝试将其放入调试中

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>';  
}
if(headers\u sent())
{
回显“发送的标题”;
回声';
变量转储(标题列表());
回声';
}
其他的
{
回显“未发送头”;
回声';
变量转储(标题列表());
回声';
}
你能用上面的输出编辑你的文章吗


谢谢

更新:对于阅读本文的任何人:这仍然是一个未解决的问题。我甚至联系了Safari开发团队,他们只是给了我机会

@基兰·艾伦

这是您要求我包含的代码的结果:

我目前的理论是Safari在使用https的安全网站上禁用快照


(我知道用这个回答我的问题不是正确的协议,但当我问这个问题时,我不是注册会员。虽然我在最后一个小时内注册了,我想我可以将这个问题称为我自己的问题,但唉,堆栈溢出不允许这样。)

发送2个缓存控制头可能没有帮助-尝试合并它们。我还建议使用“Vary:Cookie”标题作为认证页面的良好实践

你有没有看过你从hotmail和google页面上得到的那些你说没有缓存的标题

C.


我的代码中有一个输入错误:我所说的内容类型是指缓存控制。抱歉。编辑了你的帖子以反映这一变化。我的代码中有第1条、第3条和第4条语句。我添加了你建议的另外两个,但没有任何区别:(您是否检查了服务器实际发送的邮件头?您可能发送了一些ETag,同时请确保没有任何覆盖。HatAccess缓存方法。如果这些方法都不起作用,您可以将发送邮件头的代码附加到哪里?在每个“登录”中添加一个随机数怎么样页面,使用page.php?cb=OT,但不是
echo'';var\u dump(headers\u list());echo“”;
在您的上一个示例中重复了?可以从if和else中提取出来并放在后面。是的,可能是HTTPS-我想您唯一的解决方法是在URL的末尾附加一个随机字符串。我不认为随机字符串有什么区别……在测试了更多的网站后,我发现facebook也没有sn不会被缓存(除了登录页面)。facebook不是一个完全安全的网站,所以我想知道他们在做什么来防止这种情况发生。myspace也是如此。这篇文章帮了我很多忙。为什么?因为我昨天花了很多时间试图阻止safari缓存,才意识到“特殊调味品”是“HTTPS”。如果在HTTPS上测试,这不会被报告为错误。我很恼火,但松了一口气。这应该是最好的答案。
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>';  
}
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"
}
if ( $_SERVER["HTTP_X_PURPOSE"] == "preview" ) {
    // Do something for safari top sites
} else {
    // Do something for all navigators
};