47

我已经建立了一个网站 (A),它可以登录并从单独的 Web 服务中检索客户数据。

拥有 (A) 的组织也有一个网站 (B),该网站有一个 Web 表单。他们希望 (A) 上的登录客户能够点击进入 (B) 并查看包含其详细信息的预填充表单。

这意味着 (A) 必须将他们的客户 ID 写入 cookie,(B) 可以读取该 cookie,然后 (B) 可以从 Web 服务请求数据,并预填充表单。

这提出了两个问题:

  1. 网站 (B) 可以读取网站 (A) 的 cookie 吗?

  2. 如果是这样,为了防止某人编辑 cookie 并在表单中查看其他人的数据,我需要做一些事情,比如在 (A) 上加密 cookie,然后在 (B) 中解密 - 沿着这条线有什么建议吗?

我无法将现有登录名更改为 OAuth 或其他内容,因为 Web 服务已被其他几个站点使用,因此无法更改。

4

7 回答 7

45

不能。网站 B 无法从网站 A 读取 cookie。

最简单的解决方法是将登录/凭据信息从网站 A 传递到网站 B,并让网站 B 设置单独的 cookie。例如,在登录网站 A 后,您可以使用加密的查询字符串将他们快速重定向到网站 B。然后,网站 B 可以读取信息,设置自己的 cookie,并将用户重定向回网站 A。

这很混乱,但有可能。

于 2012-09-11T13:15:24.550 回答
40

你提到同一家公司拥有这两个网站。正如您所怀疑的,如果这些站点具有相同的域,例如 www.mycompany.com 和 store.mycompany.com,那么它们可以共享 cookie。HTTP 响应标头看起来像这样:

Set-Cookie: user_id=1295214458; Path=/; Domain=.mycompany.com

由于客户端可以直接访问此数据,因此您还应该包含一个签名,以便检测到篡改。通常整个事情都被加密并签署成一个“令牌”,并将其设置为cookie。但从技术上讲,只需要签名。

于 2012-09-12T18:48:26.807 回答
17

如果在您的情况下,您的所有用户都使用支持 HTML5 的浏览器,您可以使用window.postMessage允许addEventListener一侧和另一侧postMessage的方法。这是一篇不错的文章/示例:https ://developer.mozilla.org/en-US/docs/Web/API/window.postMessage 。

然后步骤很简单:

  1. 将隐藏的 iframe 添加到站点 A 到站点 B
  2. 使用 window.postMessage 将 B 的 cookie 发送给 A
  3. 将接收到的cookie存储在A的cookie中
于 2014-04-08T11:08:55.910 回答
2

Cookie 只能被设置为的单个域访问。

我相信如果您在同一个域上使用两个子域,则可以共享 cookie,但是浏览器不会将在一个域上设置的 cookie 发送给任何其他域。

编辑:您还希望避免在 cookie 中存储大量数据。您是否有机会创建站点 B 可以使用 javascript 查询的 api?

于 2012-09-11T13:20:14.893 回答
1

互联网上有一些开源工具可以做到这一点,但这与 cookie 哲学背后的整体理念背道而驰。Cookie 只能由一个域访问。但是,您可以模拟该域并“破解”到浏览器中。不建议这样做,并且某些浏览器具有更严格的安全性并且不允许这样做。

我建议您在网站 A 中创建一个 Web 服务,并授予 B 阅读权限来阅读它。

于 2012-09-11T13:19:48.673 回答
1

潜在的解决方法:您可以在辅助站点上使用内联框架来显示来自主站点的内容(占用整个窗口):

<!DOCTYPE HTML>
<html>  
  <head>  
       <title>your page title</title>  
        <style type="text/css">
            body, html {
            margin: 0; padding: 0; height: 100%; overflow: hidden;
            }
            #content {
            position:absolute; left: 0; right: 0; bottom: 0; top: 0px; 
            }
        </style>
  </head>  
  <body>
    <div id="content">
    <iframe width="100%" height="100%" frameborder="0" src="http://yourMainSite.com/dataDependentPage.php" ></iframe>
    TESTING
    </div>
  </body>  
 </html>
于 2017-10-17T20:48:27.463 回答
1

HttpCookie.Domain 属性可能会有所帮助。

摘抄:

MyCookie.Domain = domainName;
于 2019-04-19T02:37:45.067 回答