今天我在 Skype 上面试了一份 PHP 开发人员的工作,其中一个问题是关于 Cookies 和 PHP Sessions。
问题是,如果在用户浏览器中禁用了 Cookie,是否可以设置和读取、使用 PHP 会话?
我告诉他们不要,因为默认情况下 PHP 会话依赖于设置会话 cookie。当 PHP 会话开始时,新会话 Cookie 设置为默认名称 PHPSESSID,并且该 cookie 保存该会话 id 的值,例如: ftu63d8al491s5gatuobj39gk7 然后在 tmp 文件夹文件 sess_ftu63d8al491s5gatuobj39gk7 的 apache 服务器上创建并保存该会话的内容,例如: test1|s:12:"SessionTest1";test2|s:12:"SessionTest2";
他们告诉我这不是真的,即使用户在其浏览器中禁用 cookie,您也可以使用 PHP 会话。
然后我告诉他们你可以这样做,但是会话 ID 将作为 GET 变量通过 URL 传递。这并不安全,您必须在 php.ini 中进行设置。
他们在谈论即使在浏览器中禁用了 Cookie 也如何使用 PHP 会话。如果我们正在建立网上商店,而一些奶奶使用我们的网上商店并禁用了 cookie 而她却不在乎。而且 PHP 会话很棒,因为即使用户禁用了 Cookie,您也可以使用它们。我就像wtf,wtf wtf?!?!
我用两个文件进行了测试, index.php 启动会话并设置会话变量。然后 session.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,访问 index.php,然后访问 session.php,会话将被打印出来。
但是,如果您清除浏览器历史记录和 cookie,然后访问 index.php,然后访问 session.php,您会看到空数组对吗?
所以基本上我的问题是,我是对的吗?如果您在浏览器中禁用 cookie,您可以使用 PHP 会话吗?而PHP Session 机制是否默认,取决于设置一个会话COOKIE?
更新:我对此很生气,所以我给正在和我说话的人打了电话。并问他,默认情况下 PHP 会话可以在没有 cookie 的情况下工作吗?那家伙说“是的”。然后我告诉他他错了,他说:“是的,是的,如果你这么说……”然后开始大笑。然后我告诉他,如果 PHP 会话可以在不设置 cookie 的情况下工作,那么服务器如何知道当前用户/浏览器会话 id,如果它没有存储在会话 cookie 中?(我想看看他是否知道会话 id 可以作为 GET 变量传递)他至少安静了 20 秒,并告诉我他是系统管理员,我应该问那个开发人员。他今年 43 岁,拥有 13 年的丰富经验(他从 30 岁开始?wtf?),但他相信我这一点。
所以基本上,这家伙对 PHP 和 PHP 会话一无所知,是的,他是那个问我会话的人,告诉我 PHP 会话可以在没有 cookie 的情况下工作,即使我告诉他不能这样做,而且有一种方法可以在没有 cookie 的情况下使用 PHP 会话,但默认情况下它不会工作。他就像,不,不,不……最后他告诉我,他认为会话可以在没有 cookie 的情况下工作,因为他作为服务器上的系统管理员,永远看不到 tmp 文件夹中的会话?!?!?
不管怎样,那些家伙在 PHP 上很烂,我不可能接受他们的工作机会,毕竟我认为他们不会给我提供工作......
感谢所有的评论!