我需要使用 cookie 在两个不同的域之间共享 SSO 信息,这可以在 PHP 中完成吗?如何?
5 回答
在这两个域上,放置从另一个域中提取的图像或其他 Web 元素。使用 URL 通知其他域用户 X 在域 A 上,并让域 B 将该用户 ID 与其系统上的该用户相关联。
正确执行有点复杂,但是如果您认为它会很好地工作。
Vinko 在评论中指出(谢谢!),我不应该理所当然地认为您了解所涉及的安全风险。如果此信息对任何人都具有任何价值,那么您应确保使用适当的加密、身份验证等来避免泄露敏感信息并避免各种攻击(重放、中间人等)。这应该不会太繁琐,因为您可以控制两个网站,并且可以为这两个网站选择一个安全的密钥,因为通信仅通过这个特殊的 URL 在两个服务器之间进行。不过请记住。
-亚当
你不知道,cookie 绑定到一个域。对此有限制,它被称为跨站点脚本。
现在,为您的问题提供一些帮助。您可以做的是创建一个脚本来帮助它们连接。
您可以全局重写所有指向您的第二个站点的链接,这些链接将需要来自第一个站点的 cookie 信息。
您可以将站点 a 中的所有 cookie 保存到他们都可以读取的数据库中,然后以编程方式将 cookie id 查询字符串附加到站点 b 的所有链接上,然后查找该 cookie id 并在下重新设置 cookie新域。
有一个非常好的 PHP 数据库抽象库 ( PHP ADODB ),它有一个会话共享插件,使这一切变得更加容易。
好吧,如果您的域只是不同的子域,您可以通过创建.yourdomain.com
cookie 以简单的方式做到这一点。然后 cookie 与所有子域中的所有请求一起传递。
如果您想在不同的域之间共享 cookie,这并不是那么简单,因为浏览器将其视为安全风险。
确切的例子是什么?
对于某些软件,例如Google Analytics和其他跟踪图像等,您可能会被迫使用P3P标头让浏览器知道您在发送 cookie 时不关心安全性。然后,请求图像的浏览器获取 cookie 作为响应的一部分,并检查 P3P。如果一切正常,它会将 cookie 保存在硬盘上,并且下次您请求位于您网站上的图像(但属于其他域页面的一部分)时,浏览器将发送 cookie。但我想这无济于事;-)
我从来没有直接使用跨域的 cookie 值。
我不确定安全隐患,但有一个 Apache 设置允许您更改 cookie 的域。
# in httpd.conf (or equivalent)
php_value session.cookie_domain mydomain.com
我已经成功地将这种方法用于子域,但从未尝试过不同的域。
在http://us.php.net/manual/en/function.session-set-cookie-params.php中还描述了一种在 PHP 中设置变量方向的方法。该文档没有提及在不同域上设置 cookie 的能力或不能力。
在同一主题上有一个不同的Stack Overflow 线程,但我认为它没有得到充分的回答。
如果您有两个使用同一个域的站点并希望在它们之间共享 cookie,请在您的settings.php
文件中为每个域设置如下内容:
ini_set('session.cookie_domain', '.EXAMPLE.com');
确保包含前导的“。” 在域名之前,否则将无法正常工作。
这允许用户在为域范围的 cookie 配置的任何站点之间维护登录状态。
这也可能产生负面影响,因此除非您熟悉要在其之间共享 cookie 的站点所涉及的所有 cookie,否则不要这样做。