如果我有一个用户登录我的网站,将他的ID存储在$_SESSION
,并从他的浏览器中点击了一个“保存”按钮,该按钮会向服务器发出AJAX请求。他的$_SESSION
和Cookie是否会保留在此请求中,我是否可以安全地依赖$_SESSION
中的ID?
答案 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:
如果Ajax从HTML中逐字地调用 extract URL(从PHP收到),那就应该没问题,因为它们已经煮熟了(嗯,煮熟)。
如果他们需要汇总请求URI本身,则需要手动将会话ID添加到URL。 (查看here或PHP生成的页面源(with URL-rewriting on),了解如何操作。)
来自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
那是我做过的唯一方法。