2010-07-14 117 views
2

我发现我认为与Safari的热门网站图像缓存有很大的安全漏洞。对于那些不知道的人来说,Safari基本上会为你访问的每一页提供一个快照,这对用户来说应该是有用的。我的问题是,它甚至会拍摄我的网站部分受密码保护的快照。因此,如果有人抓住了我的用户电脑之一,并知道在哪里寻找,他们会拥有一个完整的内容存储库,理论上应该仅供我的用户使用。防止Safari从缓存热门网站

我测试了这个“功能”与其他网站,发现诸如Gmail和Hotmail的网站不会被缓存。那么,只有hotmail登录页面才能被缓存,但除此之外没有任何一个Gmail会被缓存。所以我的问题是这样的:我可以做什么来防止这种情况发生?无缓存,并在书中所有其他伎俩被缓存停止页面:我已经使用

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

与编译一起防止FF,IE,Opera等正常缓存。是什么赋予了?

+0

有一个在我的代码一个错字:通过内容类型我的意思是缓存控制。抱歉。 – vince 2010-07-14 08:41:03

+1

编辑你的文章以反映这一变化 – mdb 2010-07-14 09:30:31

回答

0

你试过追加一个随机查询字符串吗?

页眉应该工作(一起):

// 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); 

编辑:

尝试把本作一些调试后,您发送上面头。

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>'; 
} 

你可以用上面的输出编辑你的文章吗?

谢谢!

+0

我在我的代码中有第1条第3和第4条语句。我添加了另外两个你建议的,但它没有什么区别:( – vince 2010-07-14 08:46:05

+0

你是否检查过服务器实际上发送了哪些头文件?你可能会发送一些etags文件,并且确保你没有任何覆盖。 hatccess缓存方法。如果这些都不起作用,你可以在你发送头文件的地方附上代码吗?使用page.php?cb = <?php echo uniqid()将一个随机数字附加到每个“登录” ;?> – 2010-07-14 09:23:54

+0

OT,但不是'echo'

'; var_dump(headers_list()); echo '
';'在最后一个样本中有重复?可以从if和else中取出,并且放在后面 – Svish 2010-07-14 09:46:08

2

更新:对于阅读此内容的任何人:这仍然是一个未解决的问题。我甚至联系了Safari开发团队,他们只是让我跑来跑去。

@Kieran艾伦

这是你叫我包括代码的结果:

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" 
} 

我目前的理论是,Safari浏览器禁用使用H​​TTPS安全网站的快照。

(我知道这不是一个正确的协议来回答这个问题作为我的问题的答案,但是当我问到这个问题时,我不是一个注册成员,尽管我在最后一个小时内注册了,并且认为我能够声称这个问题是我自己的,但唉Stack Overflow不允许这样做。)

+0

是的,可以是HTTPS - 我想你唯一的解决方法是在网址末尾附加一个随机字符串 – 2010-07-14 13:05:39

+0

我不认为随机字符串有所作为...在测试了几个我发现的网站之后该Facebook也做不会被缓存(除了登录页面)。脸书不完全是一个安全的网站,所以我想知道他们在做什么,以防止这种情况发生。 myspace也是一样。 – vince88 2010-07-14 19:14:10

+0

这篇文章帮了我很多。为什么?因为,我昨天试图阻止Safari浏览器缓存,并意识到“特殊酱”是“HTTPS”。如果在HTTPS上进行测试,这不会被报告为错误。我很恼火,但松了一口气。这应该是最好的答案。 – 2010-11-18 18:45:49

0

发送2个缓存控制头可能没有帮助 - 尝试合并它们。我还会推荐一个'Vary:Cookie'标头作为验证页面的良好实践。

你看过你从Hotmail和谷歌页面得到的标题,你说没有被缓存?

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 
};