【问题标题】:Is it possible to set a cookie for a site /server other than you own?是否可以为您拥有的站点/服务器设置 cookie?
【发布时间】:2009-01-29 22:00:35
【问题描述】:

这是我的问题的快速版本:

当 cookie 用于不同的服务器(在本例中为 Exchange 邮件服务器)时,是否可以以某种方式将 cookie 设置到客户端的浏览器中?在这种情况下,尝试设置 cookie 的服务器位于“intranet.myschool.edu”,交换服务器位于“owa_server.myschool.edu”。


这是完整的问题:

我有一个 php 脚本,它使用 cURL 向启用了基于表单的身份验证的 Exchange 服务器发出 HTTP POST。

当我成功进行 HTTP POST(其中包括发布的 url 中的用户/密码)时,Exchange Server(或更具体地说,https://my.school.edu/exchweb/bin/auth/owaauth.dll 文件)输出 cookie。 具体来说,它会输出一个“sessionid”和一个“cadata”id。

通过将这些 cookie id 写入服务器上的文本文件,cURL/PHP 可以引用它,然后从 Exchange/OWA 服务器请求数据(通过 webdav 等)。

那部分有效。 我现在要解决的问题是将 cookie id 传递给客户端浏览器,以便他们可以使用这些 cookie id 自动登录到自己的 OWA 帐户。

本质上,我希望我们的用户使用他们的 Active Directory ID 登录我们的 Intranet,并查看他们最近电子邮件的快照。然后,如果他们需要,我会给他们一个小链接以切换到完整的 OWA Web 应用程序。发生此切换时,我不希望他们必须手动登录 OWA。由于他们已经在 Intranet 前面提交了他们的 Active Directory 用户名和密码,我希望他们能够自动登录到 OWA。

我应该注意,使用 Windows 身份验证尝试进行单点登录是不可能的,因为我们混合使用了 Mac OS、Windows 和 Linux。

我原以为我可以做一个“setcookie”并分配 cURL 获得的 cookie id 并将它们放入客户端浏览器中。

这不可能吗?是否不可能以这种方式“欺骗”Exchange/OWA(或任何其他站点)。 我有 cURL 捕获的合法 cookie id。有没有办法将这些传递到另一台计算机上的客户端浏览器?

在最坏的情况下,使用 Javascript 将用户名和密码自动粘贴到 OWA 登录页面是我唯一的希望吗? 有人对如何避免 Exchange/OWA 的双重登录问题有任何其他想法吗?

感谢您提供的任何帮助!

【问题讨论】:

    标签: php cookies curl exchange-server logonserver


    【解决方案1】:

    来自RFC 2965 (NB HDN = "主机域名)

    主机 A 的名称域匹配主机 B 如果

      *  their host name strings string-compare equal; or
    
      * A is a HDN string and has the form NB, where N is a non-empty
         name string, B has the form .B', and B' is a HDN string.  (So,
         x.y.com domain-matches .Y.com but not Y.com.)
    

    请注意,域匹配不是 交换运算:a.b.c.com
    域匹配 .c.com,但不匹配 反向。

    所以使用.myschool.edu 作为域应该可以工作。 NB领先。是必不可少的

    【讨论】:

    • 与上面 Alnitak 的回答重叠 :(
    【解决方案2】:

    可能可以设置一个域部分为“.myschool.edu”的cookie。理论上,它会被发送到托管在“myschool.edu”子域下的任何其他站点。

    然而,在实践中,您的客户端软件可能会认为 cookie 的范围太宽,并拒绝将其发回。

    【讨论】:

      【解决方案3】:

      如果可能的话,我认为这将是一个严重的安全漏洞......

      【讨论】:

        【解决方案4】:

        在这种情况下,尝试设置 cookie 的服务器位于“intranet.myschool.edu”,交换服务器位于“owa_server.myschool.edu”。

        你应该可以做到的。

        我在我的网站上执行此操作(出于示例的目的,我将更改名称):

        我在 url 上有一个网络应用程序

        webapp.domain.com

        当用户登录时,我将PunBB论坛包的cookie设置在:

        forum.domain.com

        通过设置/清除 PunBB 论坛 cookie,我可以方便地自动登录/注销我的用户在他们的论坛帐户上(这当然假设注册是同步的,在我的情况下,我删除了论坛注册和主站点注册为用户创建论坛帐户)。

        您只需在 subdomain#1 中将 cookie 路径设置为 "/"(默认),并将 cookie 域设置为“domain.com”。然后您的子域#2 中的应用应该会看到 cookie。

        编辑:我看到 barrowc 已经回答了,我在一些示例中看到了“.domain.com”模式,我的网站使用“domain.com”作为 cookie 域,它也可以工作(如果缺少,php set_cookie 可能会添加前导点?)

        【讨论】:

        • RFC 2965 的第 3.2.2 节说:“Domain 属性的值指定 cookie 对其有效的域。如果明确指定的值不以点开头,则用户代理提供一个前导点”
        • 谢谢! :) RFC 的第 3.3.2 节展示了一些很好的例子。
        【解决方案5】:

        您的浏览器可以决定...但通常不,您不能。这被认为是一种 XSS 漏洞。

        【讨论】:

          【解决方案6】:

          您可以使用 iframe 来设置 cookie,即。在您的网络服务器上有一个 iframe,它向您的交换 http 服务器 (https://my.school.edu/exchweb/) 上的页面发出请求,并将您想要的 cookie 变量设置为 get 或 post 变量。然后使用 vars 为该域设置 cookie,并将用户重定向到交换服务器。

          现在,OWA 的后端可能存在检查 ip 地址、用户代理等的逻辑......在注册会话时可能会使其无效......不确定

          【讨论】:

            【解决方案7】:

            几个月来,我们一直在努力解决这个问题,我们能想到的最好办法是允许 Web 服务器在每次登录时获取 Exchange 的 cookie。问题是,如果没有 cookie 亲和性,我们就无法确保 Web 服务器获得的 cookie 来自客户端连接的同一个负载平衡节点。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-08-08
              • 2010-12-20
              • 2021-08-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-08
              • 2019-03-24
              相关资源
              最近更新 更多