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,会话连续性将得到明确的关注 :
-
如果Ajax调用只是从HTML(从PHP接收)中逐字提取 URL,那应该没问题,因为它们已经被煮熟了(umm,cook)。
-
如果他们自己需要组装请求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框架不是万能的,但是他们做了这么多有用的事情!