2012-09-11 155 views
8

我已经构建了一个网站(A),它可以从单独的Web服务登录和检索客户数据。 (A)的组织也有一个网站(B),它有一个网页表单。他们希望(A)上的登录客户能够点击查看(B)并查看预先填写的表单及其详细信息。这意味着(A)必须将他们的客户ID写入cookie,其中(B)可以读取,然后(B)可以从Web服务请求数据,并预先填充表单。在两个网站之间共享一个cookie

这就产生了两个问题:

  1. 可以将网站(B)阅读网站(A)的饼干吗?如果是这样,为了防止某人编辑cookie并在窗体中看到其他人的数据,我需要做一些事情,比如在(A)上加密cookie,然后在(B)中解密 - 任何建议沿着这条线?

我不能在现有的登录名改为OAuth的或东西,因为Web服务是由其他几个网站消耗掉,所以这不能改变。

回答

12

号网站B不能从网站A.

读取一个cookie的最简单的解决办法是从一个网站通过登录/证书信息的网站B和具有B网站设置一个单独的cookie。例如,登录到网站A后,您可以使用加密的查询字符串将它们快速重定向到网站B.然后网站B可以读取信息,设置它自己的cookie,并将用户重定向回站点A.

它很混乱但可能。

+0

谢谢克里斯。问题是,没有“用户操作”表示他们想从A移动到B.他们登录到A,执行一些活动,然后他们可能在某个时候导航到B,而不是通过站点A上的链接。有可能将这两个站点与子域位于同一个域中。这会使它成为可能吗? – Sean

+0

如果在登录后,您可以将用户快速重定向到网站B,在那里设置cookie,然后重新导向它们,他们可以在将来随时访问网站B(而Cookie仍然存在)并获得该信息。 –

+0

对不起,我在第一次阅读时没有看到双重重定向。这给了我一个选择,谢谢。 – Sean

0

互联网上有开源工具可以做到这一点,但这违背了cookies理念背后的整体思想。 Cookie只能被一个域访问。然而,你可以将该域名和'Hack'嘲弄到浏览器中。这是不推荐的,一些浏览器有更严格的安全性,不允许。

我建议你在网站A中创建一个Web服务,并给B读取权限以阅读它。

1

Cookie只能访问它们设置的单个域。

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

编辑:您还希望避免将大量数据存储在cookie中。有没有可能你可以创建一个网站B可以用javascript查询的api?

8

您提到同一家公司拥有这两个网站。正如您怀疑的那样,如果这些网站具有相同的域名,如www.mycompany.com和store.mycompany.com,那么他们可以共享cookie。 HTTP响应头会是这个样子:

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

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

3

如果您的情况下所有用户都使用支持HTML5的浏览器,则可以使用window.postMessage方法,该方法允许一方使用addEventListener,另一方使用postMessage。这里有一篇很好的文章/例子:https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage

随后的步骤很简单:

  1. 添加到站点A一个隐藏的iframe到站点B
  2. 发送B的Cookie来使用window.postMessage
  3. 存储接收到的Cookie在A的饼干
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> 
相关问题