如何为另一个域设置Cookie


166

假设我有一个名为的网站a.com,并且在加载该网站的特定页面(例如页面链接)时,我想为另一个名为的网站设置Cookie b.com,然后将用户重定向到b.com

我的意思是,a.com/link我想为其设置Cookie b.com并将用户重定向到b.com

我对其进行了测试,然后浏览器实际上从接收到了Cookie a.com/link,但是它没有在向的重定向请求中发送该Cookie b.com。正常吗

我们可以为其他域设置Cookie吗?


请注意,如果您使用URL参数在b.com上设置cookie,那么任何人都可以从任何网站在b.com上强制使用任何cookie值。
朱利安

2
使用b.com的iFrame来设置cookie;)
Jaquarh's

Answers:


129

您不能为其他域设置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");
?>

但是a.com可以在重定向到b.com时以标头的形式插入相同的数据,不是吗?为什么这不会带来安全漏洞?
编码员

3
@ Coder,setcookie功能将导致cookie标头从b.com发送到浏览器。a.com无法从b.com发送Cookie标头。
qbert220

是的,这是非常不安全的,但是确实可以。如果OP拥有a.com和b.com,并且Cookie相当琐碎,那么也许还可以。
火箭快

1
最好在回答中注意这是不安全的,尽管它起作用。
罗伊·灵

2
您怎么说呢,但是youtube正在阅读由gmail创建的cookie,以便在youtube上显示其帐户?
塔哈·苏丹·特穆里

55

与最佳答案类似,但是您可以在域A上设置图片,而不是重定向到页面并再次返回,这会导致不良的用户体验。

<img src="http://www.example.com/cookie.php?val=123" style="display:none;">

然后在cookie.php中的example.com域B上,您将具有以下代码:

<?php
    setcookie('a', $_GET['val']);
?>

Hattip到李苏滨


1
漂亮的劈... :)
sotn

16
当心,这可能是一个非常糟糕的主意。通过基本上让任何人发送精心制作的GET请求以将该cookie设置为他们想要的任何值,来规避非常有意的cookie保护。我不知道您该如何处理该Cookie,但我希望它不涉及银行余额。
斯科特·斯塔福德,

我可以向您保证,它不涉及银行存款。但好点:)
乔纳森(Jonathan)

2
如果在这种情况下,每个人都可以使用自己的参数调用此域,则可以通过添加另一个参数来增加安全性。使用数据和其他盐创建一个哈希,然后将其作为参数传递。在您的cookie.php中,只需重新创建令牌并进行比较,即可验证$ _GET ['val']中的数据。
塞巴M

如果您以这种方式发送GET,则也可以使用AJAX。
user10398534

18

可能您可以使用Iframe此功能。Facebook可能会使用这种技术。您可以在此处阅读更多内容。Stackoverflow使用类似的技术,但是使用HTML5本地存储,有关此内容的更多信息,请参见其博客。


1
iframe非常适合我的解决方案,只需像正常的get请求一样将url中的值包括在内,并使用cookie值从服务器进行响应
Joel Davis

请注意,您必须正确配置Access-Control-Allow-Origin才能起作用。
user10398534

6

无法为其他域设置Cookie。

如果要将数据传递到另一个域,则可以将其编码为url。

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page

4
从url设置会话cookie具有安全风险。网址通常会被记录下来,并允许攻击者窃取用户会话
Dane Macaulay

6

您不能,至少不能直接。那将是一个令人讨厌的安全风险。

尽管您可以指定Domain属性但规范中指出:“除非Domain属性为包含原始服务器的cookie范围指定,否则用户代理将拒绝cookie。”

由于原始服务器是a.com并且不包含b.com,因此无法设置。

您需要改为b.com设置cookie。您可以通过(例如)HTTP重定向往返执行此操作b.com


我知道这是一个旧的响应,但是为什么会有安全隐患呢?您可以在控制台中还是在扩展中设置cookie?如果您可以为其他域设置Cookie,为什么会很重要?
Timberman

@Timberman —问题是有关JavaScript在不在开发人员工具中且不在显式安装的扩展程序中的网站上运行。这将带来安全隐患,因为任何访问的人都evil-hack.com 可能为此设置了Cookie,their-favourite-website.com从而会更改其在该网站上的偏好。
昆汀

我了解这一点,但是这会带来安全风险吗?我很确定它与安全无关吗?
Timberman

@Timberman —如果您看不到攻击者的网站更改您对完全不同的网站的偏好的问题,那么我不知道如何更清楚地解释它。
昆汀

我看到了问题,但是我看不出这有什么安全隐患。我确实同意您的观点,即javascript应该不能为其他域设置cookie,但是如果可以的话,这将是一个安全问题吗?
Timberman

5

如果您拥有a.my-company.comb.my-company.com不是公正的域名a.comb.com那么您可以为.my-company.com域发布Cookie- 它会被接受并发送到两个域。


1
是否可以在b.my-company.com的a.my-company.com中创建cookie?
mahesh kajale,2017年

1
除非my-company.com在“ 公共后缀黑洞列表”中,否则浏览器将无提示地忽略所有设置cookie的尝试!:'-(
迈克尔

5

参见RFC6265

用户代理将拒绝cookie,除非Domain属性为cookie的范围指定一个范围,该范围将包括原始服务器。例如,用户代理将接受来自foo.example.com的Domain属性为“ example.com”或“ foo.example.com”的cookie,但是用户代理将不接受Domain属性为的cookie。 “ bar.example.com”或“ baz.foo.example.com”。

注意:出于安全原因,许多用户代理配置为拒绝与“公共后缀”相对应的域属性。例如,某些用户代理将拒绝“ com”或“ co.uk”的域属性。(有关更多信息,请参见第5.3节。)

但是,尽管由于不安全,不建议使用上述针对图像/ iframe的解决方法。


1

您不能,但是...如果您同时拥有两个页面,则...

1)您可以通过查询参数(http://siteB.com/?key=value)发送数据

2)您可以在网站A内创建网站B的iframe,并且可以将发布消息从一个地方发送到另一个地方。由于站点B是站点B cookie的所有者,因此可以通过处理正确的帖子消息来设置所需的任何值。(您应阻止其他不需要的发件人向您发送消息!这取决于您和您决定用来防止这种情况发生的机制)


0

在此链接中,我们将找到解决方案Link

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);

那行不通。请参阅规范:“除非Domain属性为包含原始服务器的cookie指定范围,否则用户代理将拒绝cookie。”
昆汀

0

从A发送POST请求。发布请求仅在服务器端,客户端无法访问。

您可以使用CURL(推荐,服务器端)或隐藏表单(客户端)将POST请求从发送a.com到。如果您选择后者,则可能需要混淆JavaScript,以使用户无法理解该算法并对其进行干扰。b.commethod="POST"

建立网关b.com以设置Cookie:

<?php
    if (isset($_POST['data']) {
        setcookie('a', $_POST['data']);
        header("Location: b.com/landingpage");
    }
?>

如果您想进一步提高安全性,请在两侧(a.comb.com)都实现一个功能,以使用加密密码对(上a.com)和解密(上b.com)数据进行加密。

如果您要执行必须绝对安全的操作(例如,传输登录会话),请尝试使用oAuth或从https://api.cloudianos.com/docs#v2/auth获得一些启发

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.