为什么这个cookie在浏览器重新打开后会改变价值?

时间:2015-02-24 09:02:34

标签: php session cookies

这是一个简单的PHP代码,它启动会话并重新生成会话ID并在POST请求上设置cookie生存期。

<?php
// url: http://localhost/sessiontest/
session_start();
if (isset($_POST['test'])) {
    ini_set('session.cookie_lifetime', 86400);
    session_regenerate_id(true);

    header('Location: http://localhost/sessiontest/');
    return;
}
print_r($_COOKIE);
?>
<html>
    <form method="post" action="">
        <input type="text" name="test" />
        <input type="submit" />
    </form>
</html>

我在firefox 35.0.1中遇到了问题。会话ID存储在PHPSESSID cookie中。会话ID重新生成后,我关闭浏览器并打开它。浏览器关闭后,cookie值会发生变化。 chrome中没有这样的问题。

如果您打开此页面,您会看到PHPSESSID cookie带有一些值(值#1) 如果单击提交按钮,PHPSESSID cookie将被更改(值#2)

然后,如果您关闭firefox 35.0.1并重新打开它,您将看到PHPSESSID cookie的值为#1。为什么会这样?这是firefox的bug吗? 如果在重新打开后在chrome中执行相同的操作,您将看到值#2

这对我来说非常重要,因为在我的网站中,我会在用户进行身份验证时执行相同的操作。浏览器重新打开后,用户将被注销。

1 个答案:

答案 0 :(得分:0)

重新加载浏览器页面时,它还会重新提交$_POST$_REQUEST$_GET数组中的数据。 Firefox可能会重复此过程,而Chrome可能会注意到该过程已经发生过一次,而不是重新提交数据。

当您刷新表单填充页面时,Firefox通常会提出“您确定要重新提交此数据”显示,它只是不同浏览器的不同数据。要确保只有两条路线(可能更多)才会提交表单:

1)表单和会话工作在服务器页面上进行,该服务器页面不输出到浏览器而是转发到“已完成”的浏览器页面。然后刷新只需重新加载完成的页面

2)添加某种形式的标志,数据库或(其他)cookie控制,检查是否已使用cookie中的标记系统提交$_POST数据。