如果我有一个用户登录到我的网站,有他的 ID 存储在 $_SESSION,并从他的浏览器,他点击一个’保存’按钮,将作出一个 AJAX 请求的服务器。他的 $_SESSION和 cookies 是否会保留在这个请求中,我是否可以安全地依赖于 $_SESSION中的 id?
$_SESSION
如果 PHP 文件的 AJAX 请求有一个 session_start()会话信息将被保留。(禁止请求在同一域中)
session_start()
您实际上得到的是: cookie 是否与 AJAX 请求一起发送?假设 AJAX 请求针对同一个域(或者在 cookie 的域约束内) ,答案是肯定的。因此,回到同一服务器的 AJAX 请求确实保留了相同的会话信息(假设被调用的脚本发出 session _ start () ,就像任何其他想要访问会话信息的 PHP 脚本一样)。
AJAX 请求保留会话非常重要。最简单的例子是,当您尝试为管理面板执行 AJAX 请求时。当然,您将保护您发出请求的页面,不会被其他没有您在管理员登录后获得的会话的人访问。 有道理吗?
答案是肯定的:
会话在服务器端维护。就服务器而言,AJAX 请求和普通页面请求没有区别。它们都是 HTTP 请求,并且都以相同的方式在头中包含 cookie 信息。
从客户端来看,无论是普通请求还是 AJAX 请求,总是将相同的 cookie 发送到服务器。Javascript 代码不需要做任何特殊的事情,甚至不需要知道发生了什么,它只是像处理常规请求一样工作。
但是有一件事需要注意,特别是如果你使用框架,那就是检查应用程序是否在请求之间重新生成会话 ID ——任何明确依赖于会话 ID 的东西都会遇到问题,尽管显然会话中的其他数据不会受到影响。
如果应用程序像这样重新生成会话 ID,那么最终可能会出现 Ajax 请求实际上使请求页面中的会话 ID 失效/替换的情况。
这就是框架所做的,例如,如果您在 Front Controller 或 boostrap 脚本中初始化会话,那么您就不必关心页面控制器或 ajax 控制器的会话初始化。PHP 框架不是万能药,但是它们可以做很多像这样有用的事情!
也不总是。 使用 cookies,你是很好的。但是 “我是否可以安全地依靠存在的本我”敦促我用一个重要的观点来扩展讨论(主要是作为参考,因为这个页面的访问者数量似乎相当高)。
PHP 可以配置为通过 URL 重写来维护会话,而不是 Cookie
在 URL 重写(Cookie 无)会话的情况下,Ajax 调用必须自己负责 ,以确保它们的请求 URL 被正确地创建。(或者您可以滚动自己的自定义解决方案。在要求较低的情况下,您甚至可以求助于维护会话 在客户那边。)问题的关键在于,如果不使用 cookie,那么会话连续性所需的 明确的照顾:
如果 Ajax 仅从 HTML 逐字调用 提取物 URL (从 PHP 接收) ,那么应该没问题,因为它们已经熟了(嗯,Cookified)。
如果它们需要 集合请求 URI 本身,则需要手动将会话 ID 添加到 URL 中。(请检查 给你或 PHP 生成的页面源代码(开启网址重写功能) ,以了解如何执行此操作。)
来自 OWASP.org:
实际上,Web 应用程序可以同时使用两种机制,cookie 或 URL 参数,甚至从一个参数切换到另一个参数(自动 URL 如果满足某些条件(例如 没有 Cookie 支持或者 Cookie 不支持的网络客户端 由于担心用户隐私问题而接受)
来自 红宝石论坛的一篇文章:
当对 cookie 使用 php 时,即使对于 Ajax XMLHttpRequest,会话 ID 也会自动在请求头中发送。 如果你 使用或允许基于 URL 的 php 会话,则必须添加会话 ID 到每个 Ajax 请求 URL。
将 session () auth 放在所有接受 ajax 请求的服务器端页面中:
if(require_once("auth.php")) { //run json code } // do nothing otherwise
这是我唯一的办法。