【问题标题】:PHP How to stop Chrome loading a page twicePHP如何停止Chrome加载页面两次
【发布时间】:2015-11-17 16:24:58
【问题描述】:

注意:我已更新并重写了我的问题,以尝试逐点解决此问题。干杯。

我有一个问题,我不确定如何解决它。

我一直在 HTTPS 服务器上构建一个安全的登录系统(如果值得的话,SSL-labs 的等级为“A”),它工作正常,但是今天它拒绝让我登录,一些调试我发现了一些非常奇怪的东西(在我看来)。

我在网站上的会话处理有一些严重的问题,不同的页面使用相同的会话数据(当然)和相同的会话/cookie设置,并且它们正确地在彼此之间传递信息,但是 我的浏览器的行为似乎就像有两个浏览器访问相同的网站,使用相同的会话数据。

症状 - 因为我一直与页面生成的会话内容(唯一哈希令牌)不一致,不适合登录表单中保存的相同数据(作为$_POST 值),我发现只有一行在设置会话值的整个站点中,此行必须运行两次。所以我在会话中设置了一个计数器值,在表单页面上为session['counter']。每次页面加载时,计数器 +1。我的问题具体在于:

登录页面:

Opens page,  
session hash-string is generated and saved to the post form.
session counter = counter + 1;
Form is filled in.

登录验证页面:

fails to verify the posted hash-string is the same as the session hash
 string, despite there being no other cause for the session values to
 change (well there must be, but I can't see it!)  

但是,然后回到登录页面,我看到计数器 = 最后一个值 + 2!此外,记录在服务器上保存的会话文件中的计数器值始终是登录页面上显示的值的 +1。

一些图片:

登录表单页面:请注意,它位于 HTML 输出上方,并且是代码中编辑任何 SESSION 数据的最后一个位置

输出:

请注意图 1 中与计数器相关的数字。

我的会话文件,这个文件与这个特定的浏览器会话有关,并且只有 1 个会话文件,因为我是网站上唯一的浏览器。

字符串CheckDrop 是要比较的哈希值,但计数器位于12 而不是11,如上图2 所示。

  • 我的网站已通过 HTTPS 身份验证,尽管此作品位于子域上。

  • 这个问题在过去 3 小时内一直存在,但不一致,它在今天早些时候神奇地工作了大约 40 分钟(就在发布这篇文章之前)。但我没有做任何我认为改变环境的事情。

  • 我之前比较过 phpinfo 数据和会话设置数据,在浏览器输出点上看起来都正确。好像不是我的设置造成的。

  • 它发生在我电脑上的不同浏览器上。

进一步的工作

在花费数小时调试并解决此问题后,这似乎是浏览器问题。我已经重命名了页面(一个页面被称为索引,而它没有在 .htaccess 中定义为目录列表页面,它可能可能导致浏览器打开它两次)。

我已经清除了所有相关数据:会话/数据库记录/浏览器历史记录,并且遇到了一些事情:

Firefox 现在按预期登录,计数器为 count+1 并且登录有效,但是在 Chrome 上,相同页面上的完全相同的登录不起作用,并且浏览器似乎加载了两次,counter = counter + 2。 Chrome 还会在每次加载时在数据库中留下两条记录,而不是预期的一条。

Chrome 版本 45.0.24 火狐42.0版

页面重复计数并在 SafariChrome 上运行两次脚本。在 Firefox、Opera 和 MSIE 上,它按预期工作。

知道为什么会发生这种情况

我该如何解决这个问题?

【问题讨论】:

  • “加盐”...我总是看到每个人都说不要在标准 password_hash 函数中使用自己的盐。
  • 不是哈希盐,是字符串中的盐变成了哈希
  • 所以让我确保我明白了这一点:您正在对用户代理和 IP 进行哈希处理,然后将它们放入表单的隐藏输入中?他们都会在请求中返回,因此您最好检查请求标头上的 ip 和 user-agent 是否与会话中的内容匹配。你这样做的方式(除非我误解了),如果有人截获了 html,他们可以通过在 post 参数中显示哈希来模仿另一个人的 ip。
  • 这是一个令牌 CSRF 检查,@developerwjk -
  • 将值与当前浏览器进行比较,但会话中的值也会与 POST 中的值进行比较。它们不是相互排斥的比较。 @developerwjk

标签: php google-chrome session


【解决方案1】:

最初的问题是由网页的命名引起的,有一个名为“index.php”的网页,但该页面不是索引,而是“loggedIn.php”是该站点的索引页面,如定义.htaccess

拥有一个不是索引的 index.php 页面似乎会让很多浏览器感到困惑。通过重命名所有页面并设置使用 PHP 标头将人们重定向到合适的页面(基于是否登录)的 index.php 页面解决了这个问题。

Chrome 和 Safari 仍然存在问题。

看了一大堆关于 Chrome 的问题,解决方案实在是太可怜了,

https://code.google.com/p/chromium/issues/detail?id=64810

如果某些标记元素不存在,此链接列出了与 Chrome 双重加载问题相关的各种问题。由于我上面的页面非常简单,应用的并不多,但谷歌浏览器会默默地请求favicon.ico文件,如果找不到,将重新加载页面但只输出第一页(来自Chrome 内存缓存)。

这是 Chrome 中一个非常愚蠢的错误,让我花了一天的时间。 Safari 仍然坚持两次加载 PHP 脚本,

【讨论】:

  • 我想给你多票。你救了我的命。 Favicon 也是我的罪魁祸首。
  • 感谢您的坚持调查。会投票两次。唔。也许我应该用 chrome 投票?我的设置是:一个写入文件的 index.php。使用 fopen("f.txt", "w") 都是花花公子。使用 fopen("f.txt", "a"):在 chrome 下使用 fwrite() 进行双输出。必须添加一个 html 脚手架和一个带有 的 favicon。
【解决方案2】:

我参加聚会可能有点晚了,但我找到了另一个原因,为什么会发生这种情况。我创建了以下页面:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <?php
    error_log('Loaded');
    ?>
</body>
</html>

即使这个最小页面也加载了两次,但只在 Chrome 中,所以我开始调查,发现 Mendeley Web Importer Chrome 扩展程序导致了这种行为。简单地禁用它就为我解决了这个问题。

【讨论】:

    【解决方案3】:

    我想您的问题出在 Internet Explorer 上……我也遇到了同样的问题,我惊讶地发现,Internet Explorer 10 会从请求到请求发送不同的“用户代理”值。

    当我第一次看到它时,我对这个事实的荒谬印象深刻,但这是完全肯定的。我对它进行了非常深入的测试,您不能相信 Internet Explorer“用户代理”字符串在请求之间是相同的。

    我必须从散列登录字符串中删除该字符串

    【讨论】:

    • 我没有使用 Internet Explorer
    • php 不存在浏览器兼容性问题,因为它不是浏览器可以读取的语言,而且HTTP_USER_AGENT 元素严重不可信
    • 我有另一个关于 ajax 的问题(我的 salt 是动态的,但 ajax 请求改变了它,因此我失去了连接)。顺便说一句,我应该尝试在 session var 中保存所有“具有组件”,以确保没有任何奇怪的字符、空格或其他东西使你的最终哈希错误
    • 如果是这样,那么 Internet Explorer 10 将被所有关心安全的 Web 应用程序禁止。但我真的怀疑情况是否如此。你可能感染了病毒什么的。
    • 我可以向你保证我没有病毒。我在公司的不同 PC 上对其进行了测试。这是我的工作,我不会这样指责,因为我也喜欢。我可以向您保证 IE 10,直到 3 个月前(当我从我的所有公司应用程序中完全删除任何“http_user_agent”使用时)是完全不可信的。我不是第一个被这种荒谬选中的人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2014-06-09
    • 1970-01-01
    • 2011-08-28
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多