我已经定义了一个 session 来使用 PHP 存储 token ,如下所示:
$_SESSION['token'] = sha1(uniqid(mt_rand(), true));
当我想阅读这个 session 时,我在 Chrome 或 Firefox 中没有任何问题。但在 IE 中,它会在重新生成之前更改为其他内容。例如,如果我将其值存储在表单的隐藏字段中并像这样提交:
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />
我将在下一页的 IE 中得到这个结果:
echo $_SESSION['token']; // shows 1b05fab5ec11f1d50713aea6e74f84727d29b4a3
echo $_POST['token']; // shows e8fac6d55b04d1752f37ecde953f7f08b112ccca
然而,如果我在创建后立即打印 $_SESSION['token']
甚至在其创建页面结束时打印,它会准确无误地显示内容。
这个问题是为了什么?
编辑:
这是我的表格:
<form action="process/login.php" method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />
<label>Email: </label><input type="text" name="email" />
<div class="space"></div>
<label>Password: </label><input type="password" name="password" />
<div class="space"></div>
<input type="submit" value="Login" class="button" />
</form>
最佳答案
由于 PHP 和 session 存储在服务器端,而 IE 显然是客户端,因此问题不在您的 session 代码中。
session 通常由 cookie( session cookie)或通过 POST/GET 变量进行跟踪。默认情况下,在 PHP 中,此值名为 PHPSESSID。
可能,在您的情况下,链接到服务器端 session 的 session cookie 或 POST/GET 变量在 IE 中无法正常运行。在 cookie 的情况下,它可能与 cookie 设置以及是否完全允许 cookie 有关。如果是 POST/GET,则可能是您的 HTML 格式不正确,IE 不喜欢这种方式,但其他浏览器可以理解。
现在,一旦该值在 IE 中丢失,PHP 会在每个请求上为该浏览器分配一个新 session ,并在每个请求上重新生成 session token 。但是你的隐藏字段也记住了旧 token ......
如果您向我们展示更多代码(您可以编辑您的问题),我可以编辑我的答案以提供更多详细信息。
编辑 您可以先向我们展示有关 session 和 session cookie 的相关 php.ini 设置行。并仔细检查您的 IE cookie 设置。具体来说,我想知道您是否设置了 cookie_path,使 cookie 仅在同一目录中可用。
也许您甚至安装了 IE 安全设置或附加组件来阻止 cookie。因此,请尝试检查您的 IE 设置并禁用所有加载项并再次测试。
还要检查第一页(设置 session )和第二页(读取 session )是否具有完全相同的域名。
因此,例如第一页中的 www.yourdomain.com
,第二页上不应该是 yourdomain.com
(没有 www)或 www .yourdomain.com.
(末尾有一个额外的点)。
关于Internet Explorer 中的 PHP session 数据更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22115825/