6

我正在构建一个站点,该站点允许用户在我的站点上指向 CNAME 记录以运行他们的“配置文件”,这允许您的 OWN 域名在我的站点上加载您的配置文件。

这引发了与会话相关的各种问题。我见过 virb 这样做。我没有看到任何基于 iFrame 的会话信息......但页面上存在 iFrame。

我可以让域的东西正常工作,我只是丢失了会话数据......有什么想法吗?

(这里是一个例子——链接到 Virb—— http: //www.agentspider.com/ )

4

4 回答 4

5

默认情况下,您不能设置跨域 cookie。我相信,您可以设置一个 P3P 文件来启用它。http://p3ptoolbox.org/guide/section4.shtml#IVd 我自己没有这样做,所以我不知道有多少浏览器实现了它,或者它是否以这种方式工作。

Virb 看起来只是在使用 JavaScript。它有一个 AJAX 库,如果没有设置会话 cookie,它会向 virb 服务器发出JSON-P请求。(第一次加载 Firefox,你可以在 Firebug 中看到) JSON 响应只是让页面知道用户是否登录,并更新页面中需要反映用户状态的部分。

所以发生的事情是页面嵌入了一些来自 virb.com 的 JS。由于域是 virb.com,因此将设置为 virb.com 的 cookie 发送到服务器。然后服务器以 cookie 的结果响应外部站点。

对于没有 JS 无法正常工作的 virb,我认为这是一个不错的选择。但是,您可以对 HTTP 重定向执行相同的操作。

如果 HTTP 主机不是主域 (example.com):

if (!$_COOKIE['sessionid'] && $_SERVER['HTTP_HOST'] != 'example.com') {
// redirect to your main site
header('Location: http://example.com');
}

在主站点上,设置 cookie,然后通过 Location 中的会话 ID 将用户发送回外部域 (domain.com)。

header('Location: http://domain.com.com?sessid='.urlencode($_COOKIE['sessionid']));

最后一点是重定向回您所在的页面,因为您正在进行相同的会话。

setCookie(...); // sessid in $_GET['sessid']
header('Location: http://domain.com/'); 

请注意,实际上您可以在第一步中将您当前所在的页面发送回 example.com,以便稍后重定向回它。

由于您只是使用标头(您不需要输出内容)并且在大多数情况下使用 HTTP/1.1,因此您将使用同一个 TCP 套接字,我认为它非常有效,并且会比 JavaScript 选项更受支持。

编辑:当你回到外部域时不要忘记设置 cookie。

最后一步是可选的,但它可以防止 sessid 出现在 URL 中。这更像是一个安全问题,然后将其保留在 HTTP 标头中。

于 2009-08-27T11:37:06.033 回答
4

唯一的方法是将会话 id-s 添加到从一个域到另一个域的 url-s(或将该会话 id 添加到 iframe src url),然后编写会话存储后端来处理这个问题。

当然,您需要考虑这种方法带来的所有安全问题。

于 2009-08-27T10:30:56.403 回答
1

没有比这更简单的了:

1)使用源创建 domain1.com/client.html:

<script type="text/javascript" src="domain2.com/server_set_cookie.php"></script> 2) 使用 php 源创建 domain2.com/server_set_cookie.php:

header("p3p: CP=ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV");

setcookie($_REQUEST['cookie_name'], 'cookie_name', time()+3600);

http://smartcoding.wordpress.com/2009/07/12/setcookie-cross-domain-cookie-write/

于 2011-07-25T13:10:10.850 回答
0

不确定我是否理解您的问题。是否类似于另一个域调用类似 www.userprofiles.com/profile.php?userid=1 并显示结果?在这种情况下,profile.php 将在被调用时生成一个新的会话 ID。您需要使用您的站点为每个外部域设置不同的 ID,并将 profile.php 更改为:

if( isset($_REQUEST['sid']) ) session_id($_REQUEST['sid']);

session_start();

并像这样调用脚本 www.userprofiles.com/profile.php?userid=1&sid=somesessionid1234

于 2009-08-27T10:32:06.617 回答