Javascript 如何为另一个域设置cookie
假设我有一个名为Javascript 如何为另一个域设置cookie,javascript,cookies,redirect,Javascript,Cookies,Redirect,假设我有一个名为a.com的网站,当加载该网站的特定页面时,比如页面链接,我想为另一个名为b.com的网站设置cookie,然后将用户重定向到b.com 我的意思是,在加载a.com/link时,我想为b.com设置一个cookie,并将用户重定向到b.com 我对它进行了测试,浏览器实际上从a.com/link收到了cookie,但它没有在重定向请求中将cookie发送到b.com。这正常吗 我们可以为其他域设置cookie吗?您不能,至少不能直接设置。这将是一个严重的安全风险 虽然可以指定,
a.com
的网站,当加载该网站的特定页面时,比如页面链接,我想为另一个名为b.com
的网站设置cookie,然后将用户重定向到b.com
我的意思是,在加载a.com/link
时,我想为b.com
设置一个cookie,并将用户重定向到b.com
我对它进行了测试,浏览器实际上从a.com/link
收到了cookie,但它没有在重定向请求中将cookie发送到b.com
。这正常吗
我们可以为其他域设置cookie吗?您不能,至少不能直接设置。这将是一个严重的安全风险 虽然可以指定,但表示“用户代理将拒绝cookie,除非Domain属性为cookie指定一个包含源服务器的范围。” 由于原始服务器是
a.com
,并且不包括b.com
,因此无法设置
您需要获得
b.com
来设置cookie。您可以通过(例如)HTTP重定向到b.com
并返回来执行此操作。您不能为其他域设置cookie。允许这样做会带来巨大的安全漏洞
你需要让b.com设置cookie。如果a.com将用户重定向到b.com/setcookie.php?c=value
setcookie脚本可以包含以下内容来设置cookie并重定向到b.com上的正确页面
<?php
setcookie('a', $_GET['c']);
header("Location: b.com/landingpage.php");
?>
无法为另一个域设置Cookie 如果要将数据传递到另一个域,可以将其编码到url中
a.com -> b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
可能您可以为此使用
Iframe
。Facebook可能使用这种技术。你可以阅读更多关于这方面的内容。Stackoverflow使用了类似的技术,但是对于HTML5本地存储,在他们的上有更多关于这方面的内容,类似于顶部的答案,但不是重定向到页面并再次返回,这将导致糟糕的用户体验,您可以在域a上设置图像
<img src="http://www.example.com/cookie.php?val=123" style="display:none;">
然后在域B上,即cookie.php中的example.com上,您将获得以下代码:
<?php
setcookie('a', $_GET['val']);
?>
如果您拥有
a.my-company.com
和b.my-company.com
而不仅仅是a.com
和b.com
,您可以为.my company.com
域发布cookie,它将被接受并发送到这两个域。请参阅:
除非域属性无效,否则用户代理将拒绝cookie
指定cookie的作用域,该作用域将包括源
服务器例如,用户代理将接受带有
来自的“example.com”或“foo.example.com”的域属性
foo.example.com,但用户代理将不接受带有
“bar.example.com”或“baz.foo.example.com”的域属性
注意:出于安全原因,许多用户代理被配置为拒绝
与“公共后缀”对应的域属性。例如
一些用户代理将拒绝“com”或“co.uk”的域属性。
(详见第5.3节。)
但是上面提到的使用image/iframe的解决方案是可行的,尽管由于不安全,不建议使用它。您不能,但是。。。如果你拥有这两个页面,那么 1) 您可以通过查询参数()发送数据
2) 您可以在站点A内创建站点B的iframe,并且可以从一个地方向另一个地方发送post消息。由于站点B是站点B Cookie的所有者,它将能够通过处理正确的post消息来设置您需要的任何值。(您应该防止其他不需要的发件人向您发送消息!这取决于您和您决定使用的机制来防止这种情况发生)在这个链接中,我们将找到解决方案
从a发送POST请求。POST请求仅位于服务器端,客户端无法访问 您可以使用CURL(推荐,服务器端)或隐藏的
method=“POST”
表单(客户端),从a.com
向b.com
发送POST请求。如果您选择后者,您可能希望混淆JavaScript,以便用户无法理解算法并干扰它
在b.com
上创建网关以设置cookie:
这是我用过的。注意,此cookie是在开放(http)中传递的,因此不安全。我不会用它做任何需要安全的事情
站点A生成一个令牌并作为URL参数传递给站点B
站点B获取令牌并将其设置为会话cookie
您可能会添加加密/签名以确保安全。请研究如何正确执行此操作。但是a.com在重定向到b.com时可以以标题的形式插入相同的数据,不是吗?为什么这不存在安全漏洞?@Coder,setcookie功能将导致cookie头从b.com发送到浏览器。a、 com无法从b.com发送cookie头。是的,这非常不安全,但确实有效。如果OP拥有a.com和b.com,并且cookie非常琐碎,那么可能就没问题了。最好在回答中注意到这是不安全的,尽管它是有效的。你怎么能这么说呢?但是youtube正在阅读gmail创建的cookie,以便在youtube上显示他们的帐户?iframe非常适合我的解决方案,只需像普通get请求一样将这些值包含在url中,并使用cookie值从服务器响应建议,您必须正确配置访问控制Allow Origin以使其工作。请注意,如果您使用url参数在b.com上设置cookie,然后任何人都可以从任何网站强制b.com上的任何cookie值从url设置会话cookie存在安全风险。URL通常会被记录下来,并允许攻击者窃取用户会话Nice hack…:)当心,这可能是个很坏的主意。你是在故意避开首席运营官
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);