AJAX请求保留PHP会话信息吗?

如果我有一个用户login到我的网站,他的ID保存在$_SESSION ,并从他的浏览器,他点击一个“保存”button,这将向服务器发出一个AJAX请求。 他的$_SESSION和cookie会保留在这个请求中吗?我可以安全地依赖$_SESSION的id吗?

答案是肯定的:

会话维护在服务器端。 就服务器而言,AJAX请求和常规页面请求之间没有区别。 它们都是HTTP请求,它们都以相同的方式在标头中包含cookie信息。

从客户端来说,不pipe是普通请求还是AJAX请求,相同的cookies都会被发送到服务器。 Javascript代码不需要做任何特殊的事情,甚至不需要知道发生了什么事情,它只是和普通的请求一样。

你真正得到的是:cookie是通过AJAX请求发送的吗? 假设AJAX请求是在相同的域(或在cookie的域限制内),答案是肯定的。 所以AJAX请求返回到同一台服务器保留相同的会话信息(假设被调用的脚本发出session_start()任何其他PHP脚本想要访问会话信息)。

如果AJAX请求的PHP文件具有session_start() ,会话信息将被保留。 (禁止请求在同一个域内)

那么,并不总是。 使用cookies,你是好的。 但是, “我可以安心地依靠存在的身份证”,促使我扩大讨论的重点(主要是供参考,因为这个网页的访问者数量似乎相当高)。

PHP可以configuration为通过URL重写来维护会话,而不是Cookie。 ( 好坏之间的关系如何 (例如参见最上面的评论)是一个单独的问题 ,让我们现在坚持现在的一个,只有一个附注:基于URL的会话最突出的问题 – 公然的裸体会话ID的可见性 – 对于内部Ajax调用不是问题;但是,如果为Ajax打开,则对于站点的其余部分也会打开,所以在那里…)

在URL重写(无Cookie)会话的情况下,Ajax调用必须自己处理它们的请求URL。 (或者您可以推出自己的定制解决scheme,甚至可以在不太需求的情况下,在客户端维护会话。)重点在于如果不使用cookie,会话连续性将得到明确的关注

  1. 如果Ajax调用只是从HTML(从PHP接收)中逐字提取 URL,那应该没问题,因为它们已经被煮熟了(umm,cook)。

  2. 如果他们自己需要组装请求URI,则会话ID需要手动添加到URL中。 ( 在这里查看,或者PHP生成的页面源代码( 带有URL重写 )以查看如何执行此操作。)


从OWASP.org :

实际上,如果满足某些条件(例如,没有Cookie支持的Web客户端的存在或者Cookie不存在),则Web应用程序可以同时使用机制,Cookie或URL参数,甚至可以从一个切换到另一个(自动URL重写)由于用户隐私问题而被接受)。

从一个Ruby论坛的post:

当使用cookie和cookie时,会话ID将自动发送到请求头中,即使对于Ajax XMLHttpRequests也是如此。 如果您使用或允许基于URL的PHP​​会话,则必须将会话ID添加到每个Ajax请求url。

AJAX请求保留会话是非常重要的。 最简单的例子是,当你尝试做pipe理面板的AJAX请求,比方说。 当然,您将保护您提出请求的页面,而不是由pipe理员login后没有获得会话的其他人访问。 说得通?

有一件事需要注意,特别是如果你使用的是框架,就是检查应用程序是否在请求之间重新生成会话标识 – 任何明确依赖于会话标识的东西都会遇到问题,但显然其余的数据会议将不受影响。

如果应用程序正在重新生成这样的会话标识符,那么最终可能会出现这样的情况:实际上,ajax请求将使请求页面中的会话标识符无效/replace。

这就是框架所做的事情,例如,如果你在Front Controller或者boostrap脚本中初始化会话,你将不必关心页面控制器或者AJAX控制器的初始化。 PHP框架不是万能的,但是他们做了这么多有用的事情!