PHP会话与残疾的cookies,它的工作?

今天,我有一个作为PHP开发人员的Skype工作面试,其中一个问题是关于Cookies和PHP会话。

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

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

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

然后我告诉他们你可以做到这一点,但是会话ID将作为GETvariables通过URL传递。 这不安全,你必须在php.ini中设置它。

他们正在谈论如何使用PHP会话,即使Cookies在浏览器中被禁用。 而如果我们正在build设网上商店,一些奶奶使用我们的网上商店,并禁用cookies,她不会在意。 而且PHP会话很棒,因为即使用户禁用Cookies,也可以使用它们。 我就像wtf,wtf wtf?!?!

我做了两个文件的testing,index.php启动会话并设置会话variables。 然后session.php尝试读取会话variables。

这是它的样子:

的index.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> 

session.php文件

 <?php session_start(); var_export($_SESSION); ?> <p><a href="index.php">Back</a></p> 

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

但是,如果您清除浏览器历史logging和Cookie,然后访问index.php,然后访问session.php,您会看到空arrays是否正确?

所以基本上我的问题是,我说得对吗? 如果您在浏览器中禁用Cookie,您可以使用PHP会话吗? 并且默认做PHP Session机制,取决于设置一个会话COOKIE?

更新:我对此感到生气,所以我打电话给我正在和他谈话的那个人。 问他,PHP会话可以在没有Cookie的情况下默认工作吗? 那家伙说“是”。 然后我告诉他他错了,他说:“是的,是的,如果你这么说…”,开始笑。 然后我告诉他,如果PHP会话可以在没有设置cookie的情况下工作,那么服务器如果知道当前用户/浏览器会话ID,如果它没有存储在会话cookie中,该怎么办? (我想看看他是否知道会话ID可以作为GETvariables传递)他至less安静了20多年,并告诉我,他是一个系统pipe理员,我应该问开发人员。 他现年43岁,在商务领域有13年的丰富经验(他从30岁开始),但他相信我。 我向他解释了Session是如何工作的,并且你可以在没有Cookie的情况下使用它,但是session ID是作为GETvariables传递的,告诉他我告诉他们在面试时,他们告诉我不,不,不。

所以基本上,这个人对PHP和PHP会话没有任何线索,是的,他问我有关会话的问题,告诉我PHP会话可以在没有cookie的情况下工作,即使我告诉他不能做到这一点,有一种方法可以在不使用cookies的情况下使用PHP会话,但默认情况下不起作用。 他喜欢,不,不……不,最后,他告诉我,他认为会议可以没有cookies的工作,因为他作为系统pipe理员在他的服务器上,永远不会看到在tmp文件夹中的会话?!?!?

无论如何,这些人吸吮PHP,我不会接受他们的工作机会,毕竟,我不认为他们会为我提供一份工作。

感谢所有的评论!

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

会议:介绍

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

如果session.use_cookies = 0(Cookie被禁用)

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

所以基本上我的问题是,我说得对吗?

大多。 在现实世界中: 是的

如果您在浏览器中禁用Cookie,您可以使用PHP会话吗?

只要以某种方式获得浏览器身份并产生一个唯一值 (并将此值传递给PHP会话层), 可以使用PHP会话而不使用Cookie。

  • GET中的会话ID(如果cookie不被允许,这是“标准的”PHP方式,以及你描述的“其他”方式)。 这个值然后由PHP自动传播,例如添加到所有的A HREF等等。 如果由于自动链接识别失败而无法传播(例如,使用Javascript构build的复杂URL),则您有责任提供相应的信息。

或者 – 我们现在不在堪萨斯了:

  • Auth Digest) (这是一个肮脏的技巧,当然要求整个站点在Auth-Digest访问authenticationscheme背后,而且你不能再使用“dummy auth”(即http:// welcome :guest@www.example.com ),因为一些浏览器,例如Internet Explorer,由于安全原因不再支持它们)
  • 通过其他方式识别浏览器(“指纹”)( 这通常是(1)自杀
  • 如果LSU(本地共享对象)不存在,则使用LSO(本地共享对象)生成一个随机的UUID,并将其存储起来,以便在随后的访问中检索它。
  • 其他方式(请参阅http://en.wikipedia.org/wiki/Evercookie

(1)如果您在一个可以信任IP的局域网中,可以将“会话”与用户IP关联起来。 您可以在一家小公司执行严格的“无Cookie”政策,并且仍然有用户会话,而不会诉诸会话ID的_GET / _POST。

当cookies被禁用时,是会话将工作。 但首先检查phpconfiguration设置。 喜欢:

  --enable-trans-sid and --enable-track-vars 

如果这些值设置为true,则会话将自动通过POST传递。

如果“–enable-trans-sid”和“–enable-track-vars”值设置为FALSE,则需要使用SID常量传递会话ID。

 < a href="index.php?<?= SID ?>" >Navigate from here< /a > 

需要设置php.ini

 ini_set("session.use_cookies", 0); ini_set("session.use_trans_sid", 1); 

如果是我,我会说“是”

既然你可以存储会话在表单/url的某个地方传递到下一页(非常糟糕的主意)。 所以,根据他的问题“如果Cookies在用户浏览器中被禁用,PHP会话是否可以被设置和读取?

那么,应该是的。 它可以读取和使用。

但是,如果用户closures浏览器,那么它已经消失了,就是这样。 (因为那家伙没有问这个部分)

是的,它会工作
1.PHP会在名称为PHPSESSID的URL中传递一个GET参数,但可以在php.ini文件中更改session.name。
2.在同名表格中添加一个隐藏的input。

我认为HTML5会话存储还有第三种方式! 如果我们在服务器上手动保留会话数据,并根据存储在会话存储中的会话标识使用AJAX获取整个自定义页面?

问题是会话存储也可以被禁用: https : //stackoverflow.com/a/25050910/8460132