AJAX请求是否保留PHP会话信息?

时间:2009-03-24 10:39:59

标签: php ajax session

如果我有一个用户登录我的网站,将他的ID存储在$_SESSION,并从他的浏览器中点击了一个“保存”按钮,该按钮会向服务器发出AJAX请求。他的$_SESSION和Cookie是否会保留在此请求中,我是否可以安全地依赖$_SESSION中的ID?

8 个答案:

答案 0 :(得分:181)

答案是肯定的:

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

从客户端,无论是常规请求还是AJAX请求,都将始终向服务器发送相同的cookie。 Javascript代码不需要做任何特殊的事情,甚至不需要知道这种情况,它只是与常规请求一样。

答案 1 :(得分:23)

您真正得到的是:使用AJAX请求发送的Cookie是什么?假设AJAX请求是在同一个域(或在cookie的域约束内),答案是肯定的。因此,返回同一服务器的AJAX请求会保留相同的会话信息(假设被调用的脚本根据需要访问会话信息的任何其他PHP脚本发出session_start())。

答案 2 :(得分:22)

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

答案 3 :(得分:8)

嗯,并非总是如此。使用Cookie,你很好。但是“我可以安全地依赖id存在吗”敦促我以一个重要的观点扩展讨论(主要是为了参考,因为这个页面的访问者数量似乎很高)。

PHP可以配置为通过URL重写而不是cookie来维护会话。 How it's good or bad(< - 请参见例如最顶层的评论)是separate question,让我们现在坚持使用当前的一个,只有一个侧注:URL最突出的问题内部会话 - 裸会话ID的明显可见性 - 不是内部Ajax调用的问题;但是,如果它为Ajax打开,它也会为网站的其余部分打开,所以那里...... 。)

如果是URL重写(无cookie)会话,Ajax调用必须自己处理,以确保其请求URL正确制作。 (或者您可以推出自己的自定义解决方案。您甚至可以在要求较低的情况下使用维护会话on the client side。)重点是会话连续性所需的显式关注,如果不使用的Cookie:

  1. 如果Ajax从HTML中逐字地调用 extract URL(从PHP收到),那就应该没问题,因为它们已经煮熟了(嗯,煮熟)。

  2. 如果他们需要汇总请求URI本身,则需要手动将会话ID添加到URL。 (查看here或PHP生成的页面源(with URL-rewriting on),了解如何操作。)


  3. 来自OWASP.org

      

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

    来自Ruby-forum帖子:

      

    当使用带cookie的php时,即使对于Ajax XMLHttpRequests,会话ID也会自动发送到请求头中。 如果你   使用或允许基于URL的php会话,您必须添加会话ID   每个Ajax请求URL。

答案 4 :(得分:3)

AJAX请求保留会话非常重要。最简单的例子是当你尝试为管理面板做一个AJAX请求时,让我们说。当然,您将保护您发出请求的页面,而不是那些没有管理员登录后会话的其他人访问的页面。 有意义吗?

答案 5 :(得分:0)

值得注意的是,特别是如果您使用的是框架,那么检查应用程序是否在请求之间重新生成会话ID - 明确依赖于会话ID的任何内容都会遇到问题,尽管显然其余部分会话中的数据不受影响。

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

答案 6 :(得分:0)

这就是框架所做的事情,例如:如果你在Front Controller或boostrap脚本中初始化会话,你就不必关心页面控制器或ajax控制器的初始化。 PHP框架不是灵丹妙药,但他们做了很多有用的事情!

答案 7 :(得分:0)

在接受ajax请求的所有服务器端页面上放置您的session()身份验证:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

那是我做过的唯一方法。