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

Do AJAX requests retain PHP Session info?

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


答案是肯定的:

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

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


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


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


好吧,并非总是如此。使用cookies,你很好。但是"我能否安全地依赖于存在的身份"促使我以一个重要的观点扩展讨论(主要是为了参考,因为这个页面的访问者数量似乎很高)。

PHP可以配置为通过URL重写而不是cookie来维护会话。 (它是好还是坏(< - 参见例如那里最顶层的评论)是一个单独的问题,让我们现在坚持当前的一个问题,只有一个侧面说明:基于URL的会话最突出的问题 - 公然裸会话ID的可见性 - 内部Ajax调用不是问题;但是,如果它为Ajax打开,它也会为网站的其余部分打开,所以那里......)

在URL重写(无cookie)会话的情况下,Ajax调用必须自己处理它们的请求URL是否正确制作。 (或者您可以推出自己的自定义解决方案。在不太严格的情况下,您甚至可以在客户端维护会话。)重点是会话连续性需要明确的关注,如果不使用cookie:

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

  • 如果他们需要自己组装请求URI,则需要手动将会话ID添加到URL。 (请在此处查看,或者由PHP生成的页面源(使用URL重写)以查看如何执行此操作。)

  • 来自OWASP.org:

    Effectively, the web application can use both mechanisms, cookies or
    URL parameters, or even switch from one to the other (automatic URL
    rewriting) if certain conditions are met (for example, the existence
    of web clients without cookies support or when cookies are not
    accepted due to user privacy concerns).

    来自Ruby论坛帖子:

    When using php with cookies, the session ID will automatically be sent in the request headers even for Ajax XMLHttpRequests. If you
    use or allow URL-based php sessions, you'll have to add the session id
    to every Ajax request url.


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


    将session()auth放在接受ajax请求的所有服务器端页面中:

    1
    2
    3
    4
    5
    6
    7
    if(require_once("auth.php")) {

    //run json code

    }

    // do nothing otherwise

    这是我做过的唯一方式。


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


    但要注意的一件事是,特别是如果您使用的是框架,那就是检查应用程序是否在请求之间重新生成会话ID - 显式依赖于会话ID的任何内容都会遇到问题,尽管很明显其他数据在会议不会受到影响。

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