具有禁用 cookie 的 PHP 会话,它有效吗?

2022-08-30 10:32:21

今天,我参加了一份PHP开发人员的Skype面试,其中一个问题是关于Cookie和PHP会话的。

问题是,如果在用户浏览器中禁用了Cookie,是否可以设置和读取,使用PHP会话?

我没有告诉他们,因为默认情况下PHP会话取决于设置会话cookie。当PHP会话启动时,新会话Cookie设置为默认名称PHPSESSID,并且该cookie保存该会话ID的值,例如:ftu63d8al491s5gatuobj39gk7然后在apache服务器上的tmp文件夹中创建sess_ftu63d8al491s5gatuobj39gk7文件并保存该会话的内容,例如:test1|s:12:“SessionTest1”;test2|s:12:“SessionTest2”;

他们告诉我这不是真的,即使用户在浏览器中禁用了cookie,您也可以使用PHP会话。

然后我告诉他们你可以这样做,但是会话ID将作为GET变量通过URL传递。这并不安全,你必须用php.ini来设置它。

他们正在谈论如何使用PHP会话,即使Cookie在浏览器中被禁用。如果我们正在建立网上商店,一些奶奶使用我们的网上商店并禁用cookie,她不在乎。PHP会话很棒,因为即使用户禁用Cookie,您也可以使用它们。我就像wtf,wtf wtf?!?!

我用两个文件进行了测试,索引.php启动会话并设置会话变量。然后会话.php尝试读取该会话变量。

这是它的外观:

索引.php

<p>This is where I start and set php sessions.</p>

<?php

    session_start();
    $_SESSION['test1'] = "SessionTest1";
    $_SESSION['test2'] = "SessionTest2";

?>

<p>This is a link, that starts new HTTP Request, and tries to read session set on this page:</p>
<p><a href="session.php">Read Session</a></p>

会话.php

<?php

    session_start();
    var_export($_SESSION);

?>

<p><a href="index.php">Back</a></p>

现在,如果您在浏览器中启用cookie,访问索引.php,并且访问会话.php,会话将被打印出来。

但是,如果您清除浏览器历史记录和cookie,然后访问索引.php,然后访问会话.php,您会看到空数组吗?

所以基本上我的问题是,我是对的吗?如果您在浏览器中禁用 Cookie,是否可以使用 PHP 会话?默认情况下,PHP会话机制是否取决于会话COOKIE的设置?

更新:我对此感到疯狂,所以我打电话给与我交谈的那个人。并问他,PHP会话可以默认在没有cookie的情况下工作吗?那家伙说“是的”。然后我告诉他他错了,他说:“是的,是的,如果你这么说......”并开始大笑。然后我告诉他,好吧,如果PHP会话可以在不设置cookie的情况下工作,如果它没有存储在会话cookie中,服务器如何知道当前的用户/浏览器会话ID?(我想看看他是否知道会话ID可以作为GET变量传递)他至少沉默了20多岁,并告诉我他是系统管理员,我应该问问开发人员。而且他已经43岁了,在商业领域有13年的丰富经验(他从30岁开始?wtf?),但他信任我。我向他解释了会话是如何工作的,你可以在没有Cookie的情况下使用它,但随后会话ID被传递为GET变量,并告诉他我在面试时告诉他们,但他们告诉我不,不不...:S

所以基本上,这个家伙对PHP和PHP Sessions一无所知,是的,他是那个问我关于会话的人,告诉我PHP Session可以在没有cookie的情况下工作,即使我告诉他它不能完成,并且有一种方法可以在没有cookie的情况下使用PHP会话,但它在默认情况下不起作用。他说,不不不...最后,他告诉我,他认为会话可以在没有cookie的情况下工作,因为他作为服务器上的系统管理员,永远无法在tmp文件夹中看到会话?!?!?

无论如何,那些家伙在PHP上很糟糕,我不可能接受他们的工作邀请,毕竟我不认为他们会给我一份工作......

感谢您的所有评论!


答案 1

“访问您网站的访问者被分配一个唯一的ID,即所谓的会话ID。这要么存储在用户端的Cookie中,要么在URL中传播。"

课程:简介


答案 2

如果 session.use_cookies = 1(已启用 Cookie。

如果 session.use_cookies = 0(Cookie 已禁用。

如果 session.use_cookies = 1,则会话将 sessionId 存储到 cookie 中。调用session_id() 从 cookie 获取存储的 sessionId,并将保存到会话数组中的数据保存在所有页面上。如果 session.use_cookies = 0 在这种情况下,会话不会将 sessionId 存储到 cookie 中,每次使用 session_id() 获得新的 sessionId 时,存储在其他页面上的会话中的数据将不会在其他页面上找到。


推荐