gpt4 book ai didi

javascript - Cookie欺骗到没有点前缀的域

转载 作者:行者123 更新时间:2023-12-04 01:43:34 25 4
gpt4 key购买 nike

我有一个无法解决的怪异问题,所以我希望有一个比我聪明的人可以帮忙!

我有一个网站https://example.com(无子域)

我有一些设置Cookie的代码,例如

var value="some value";
document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";

此代码在页面加载期间在某些脚本标签中运行。首次加载页面时,我看到了我的cookie集,并且在(chrome)开发工具>应用程序>域列中,我看到它在 .example.com上设置了前导点,这很好。

但是,然后刷新页面,我的代码再次运行(并且有一个新值被推送到cookie;如果这很重要,则不知道)。我在“应用程序”选项卡中查找,现在看到 myCookie的“重复”条目-一个在 .example.com上,另一个在 example.com上(无前导点)。值是相同的。 这对我来说很奇怪,我不知道为什么会这样。是否有人有任何可能的原因导致这种情况发生?

在这个兔子洞的更深处。.我再次刷新页面,并且 myCookie上的 .example.com值更新,但是 example.com上的那个不更新。更怪异!

同时,我还有其他尝试读取Cookie的代码,但显然 myCookie上的 example.com cookie优先,并且我获得了该值,而不是最新值(反射(reflect)在 .example.com cookie中)。

我已经尝试在 .example.com( domain=.example.com)上显式设置cookie,但是上述行为仍然发生。而且,据我所知,在JavaScript中我没有办法显式引用 .example.com上的cookie- document.cookie仅显示 example.com一个(但“开发工具”的“应用程序”选项卡确实显示了它)?这是否在javascript中公开?

我无法提供该网站的链接,但是我可以尝试回答有人可能需要澄清的任何问题。

但是我的主要问题是:有人能解释这种情况发生的可能原因,或者至少提供一些可能使我朝着正确方向迈进的东西吗?还是失败了,或者有一些解决方法可以从 .example.com显式读取?

编辑

此时,我最好的猜测是网站上的其他内容(可能是服务器端脚本)正在将cookie从 .example.com复制到 example.com,但前提是值有所更改。但这纯粹是猜测。我还没有找到任何客户端证明(到目前为止),而且我实际上没有访问服务器端内容的权限。无论如何,这可能正在捕获稻草。但是,这是我最好的工作原理,是ATM可以带回网站开发人员询问有关问题。

更新-我发现了新东西/说明

要清除/重声明:我的网站位于 https://example.com上,带有 ,没有子域。

这似乎只发生在我的Cookie上,其中该值会更改每次页面加载。值不变的Cookie似乎不会从 .example.com推送到 example.com

即使对于具有动态值的cookie,似乎也只是第一次将 .example.com复制为 example.com。此后,即使 example.com版本获得了新的动态值, .example.com cookie值在后续页面加载时也不会更改。

我创建了一个测试脚本,与当前观察到此行为的cookie分开,以进行分而治之。我想尽可能地使用设置/读取cookie和黑盒的代码来排除所有恶作剧。

但是我看到了相同的行为。我仍然怀疑这是某种服务器错误,例如 .example.com cookie在下一个http请求中发送,然后服务器仅在第一次将它们写回 example.com ..?那是双重情节扭曲。我无权访问服务器端的内容,但我什至不知道从哪里开始寻找网站开发人员要看的内容。

还要注意,到目前为止,在我和我的同事之间,我们测试了设置问题cookie的javascript库/代码,以及下面6个其他站点(甚至根本不属于此问题站点)的黑盒脚本并且无法重现该问题,这进一步使我们怀疑这是某种服务器配置问题(但同样,我们真的不知道从哪里开始)。

无论如何,以防万一,它对我有帮助,下面是我写给(进一步)测试此问题的脚本。我总共测试了8个Cookie:
  • test_no_dot_static -我将domain=example.com设置为静态值
  • test_no_dot_dynamic -我将domain=example.com设置为动态值
  • test_dot_static -我将domain=.example.com设置为静态值
  • test_dot_dynamic -我将domain=.example.com设置为动态值
  • test_implicit_no_domain_static -我使用设置了具有静态值的cookie,没有指定了domain=
  • test_implicit_no_domain_dynamic -我使用设置了具有动态值的cookie,没有 domain=指定
  • test_explicit_no_domain_static -我设置了带有静态值的cookie,并使用指定的domain=没有值
  • test_explicit_no_domain_dynamic -我设置了一个具有动态值的cookie,其中未指定domain=,但未指定没有值
  • #1, #3-这些最初是在 .example.com上设置的,在刷新页面时不会被欺骗到 example.com #2, #4-这些最初在 .example.com上设置。在首页刷新时,原始值被复制到 example.com cookie / domain。在第二页以上刷新时, example.com cookie值不会更改(保留原始值),并且每次加载页面时 .example.com版本都会获得新值。
    #5, #7-这些最初在 example.com(不是 .example.com)上设置,并且在 .example.com上从来没有版本。
    #6, #8-这些最初是在 example.com(不是 .example.com)上设置的,并且它们的值会更新每次页面加载,并且 .example.com上永远不会有版本。

    测试代码
    var s_testCookies = {
    getCookieValue: function(a) {
    var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
    return b ? unescape(b.pop()) : '';
    },
    getRandomValue: function() {
    return '' + (new Date()).getTime() + '|' + Math.floor(Math.random() * 100000);
    },
    run: function(data) {
    var data = data || {};
    console.log('------------------------');
    console.log('Arg: ', JSON.parse(JSON.stringify(data)));
    data.previousValue = s_testCookies.getCookieValue(data.name);
    console.log('Previous: ', JSON.parse(JSON.stringify(data)));
    data.cookie = data.name + "=" + escape(data.value) + "; path=/;";
    data.cookie+= (typeof data.domain!='undefined') && (" domain="+data.domain+";") || "";
    document.cookie = data.cookie;
    data.newValue = s_testCookies.getCookieValue(data.name);
    console.log('New: ', JSON.parse(JSON.stringify(data)));
    console.log('------------------------');
    }
    } // end testCookies

    s_testCookies.run({
    'message': 'no dot static value',
    'domain': 'example.com',
    'name': 'test_no_dot_static',
    'value': 'no dot static value'
    });
    s_testCookies.run({
    'message': 'no dot dynamic value',
    'domain': 'example.com',
    'name': 'test_no_dot_dynamic',
    'value': s_testCookies.getRandomValue()
    });
    s_testCookies.run({
    'message': 'dot static value',
    'domain': '.example.com',
    'name': 'test_dot_static',
    'value': 'dot static value'
    });
    s_testCookies.run({
    'message': 'dot dynamic value',
    'domain': '.example.com',
    'name': 'test_dot_dynamic',
    'value': s_testCookies.getRandomValue()
    });
    s_testCookies.run({
    'message': 'implicit no domain static value',
    'name': 'test_implicit_no_domain_static',
    'value': 'implicit no domain static value'
    });
    s_testCookies.run({
    'message': 'implicit no domain dynamic value',
    'name': 'test_implicit_no_domain_dynamic',
    'value': s_testCookies.getRandomValue()
    });
    s_testCookies.run({
    'message': 'explicit no domain static value',
    'domain':'',
    'name': 'test_explicit_no_domain_static',
    'value': 'explicit no domain static value'
    });
    s_testCookies.run({
    'message': 'explicit no domain dynamic value',
    'domain':'',
    'name': 'test_explicit_no_domain_dynamic',
    'value': s_testCookies.getRandomValue()
    });

    基于提供的评论/答案的另一个更新

    明确地说,实际上,问题是我们在页面加载时设置了一些Cookie值。然后,当刷新页面(或在网站上导航到另一个页面)时,我们读取值,对其进行处理,生成新值,然后再次设置cookie。洗净漂洗重复每一页(重新)加载。

    问题出在初始页面 View 上,这些cookie是在 .example.com域上设置的。然后,在下一页加载时,初始cookie /值将被复制到 exampe.com,并且 .example.com上的cookie也将获得更新的值。然后在另一个页面加载时,先前的 .example.com值不会被复制/推送到cookie的 example.com版本;仅 .example.com版本更新。因此,仅在第二页加载时将其复制/推送到 example.com。不是3rd +。

    同时, example.com cookie优先,并且是我们解析cookie值时返回的 document.cookie。因此,在第3页以上的页面加载中,我们只从 example.com cookie返回的页面#2中获取值,而不是 .example.com中的更新值

    同时,我们不能简单地不指定 domain=值(上面的 #6 or #8),因为实际上在播放子域,例如 mobile.example.com也具有读取/更新/写入这些cookie的代码,如果我们未指定域,则该cookie仅在 example.com上可用,而不能在 mobile.example.com上读取。

    Udpate

    @ffeast 提出了以下问题:

    What does curl -I yourdomain return? Are there any Set-Cookie headers?



    干得好!
    user@host:~$ curl -I https://example.com
    HTTP/1.1 200 OK
    X-Powered-By: Express
    set-cookie: site#lang=en; Path=/;Secure
    set-cookie: connect.sid=s%3As46fwOPaosGdwis0G_Wdv7gzUs75Q0rr.O1gLsLmrHmmdBXxPWJrIq8UWwOOaQf96qxUlW%2FxnEuM; Path=/; HttpOnly;Secure
    Cache-Control: no-cache, no-store, must-revalidate
    Pragma: no-cache
    Expires: 0
    Content-Type: text/html; charset=utf-8
    Content-Length: 19632
    ETag: W/"4cb0-bgHMEy79PzLMv7jhB1Lh6A"
    Vary: Accept-Encoding
    Date: Fri, 16 Mar 2018 20:42:19 GMT
    Connection: keep-alive
    Set-Cookie: SecureCookie=!zPdIdxiz3mOMe2MYzy1p873u0yWtMdduASsHoU06gkaLs306mhR7cb3ir4TA2EG2cQGKmeVWJeYvxA/flQfPQUixqL8WMOfROsTgu3UZZg==; path=/; Httponly; Secure

    我还从浏览器选项卡中看到了相同的响应头。

    因此,初始的HTTP响应中有一些set-cookie header ,是的。它们不是我个人可以了解的或与我有关的 cookies ,但是我可以问一下它们的用途,如果有帮助的话。例:

    我注意到没有为它们显式设置 domain=值..这是否可能以某种方式为浏览器树立了先例,还是我吠叫了错误的树?即使这样做,我也不会认为仅将 example.com解释为更改其值的cookie的欺骗,还是仅在第二页加载时发生(不是第三页以上)?不确定您要如何处理这个问题,但我无所不能!

    最佳答案

    如果您的目标是在所有子域之间使用cookie共享,并允许所有人访问和设置cookie,则每次设置cookie时都需要指定根域。

    假设您有sub.example.comsub2.example.comexample.com,并且想要在它们之间共享cookie,然后将域设置为example.com。当您不指定域时,cookie只是example.comsub.example.com的属性,但是当您将domain指定为example.com时,example.com及其所有子读写域都可以访问它。

    domain=domain (e.g., 'example.com' or 'subdomain.example.com').
    If not specified, defaults to the host portion of the current document location (but not including subdomains). Contrary to earlier specifications, leading dots in domain names are ignored, but browsers may decline to set the cookie containing such dot . If a domain is specified, subdomains are always included.
    [source: developer.mozilla.org]



    在example.com中:
    var value="some value";
    document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";

    在sub.example.com中:(与上面相同)
    var value="some value";
    document.cookie="myCookie="+escape(value)+"; path=/; domain=example.com";

    在这两种情况下,您都必须将其设置为 example.com。否则可能会出现以下情况
  • example.com中,如果您忘记在单个位置设置example.com,则只会为example.com创建一个新cookie,该cookie与共享的cookie不同,并且不会与它同步,从而造成很多困惑。
  • sub.example.com中,如果您忘记在单个位置设置example.com,则只会为sub.example.com创建一个新cookie,该cookie与共享的cookie不同,并且不会与它同步,从而造成很多困惑。
  • 您不应该将cookie设置为.example.com,因为根据上述引用,它不受欢迎。

  • Cookie重复的可能原因:
  • 首次加载页面时,JavaScript通过指定domain=example.com设置cookie来设置.example.com的cookie,当发出第二个请求时,浏览器将cookie发送到服务器,服务器端接收新cookie的一些代码会将其重新设置为example.com。这只能通过检查第二个请求的响应头来验证。
  • 首次加载页面时,JavaScript通过指定domain=example.com设置cookie来设置cookie的.example.com。当页面加载几秒钟后,任何JavaScript代码都会被错误地设置,而未指定domain=example.com来设置example.com的cookie。这只能通过检查设置cookie中涉及的JavaScript代码来验证。

  • 我相信意外创建域/子域特定的cookie是造成您描述的所有异常的原因。复查设置cookie的代码的每个部分都可以解决此问题。

    UPDATE: What is really happening here.



    您正在使用 InvocaJS v3.6.6 AngularJS v1.2.19 ,它们都具有cookie管理功能。 InvocaJS将数据以 invoca_session的形式存储在cookie中,并指定域 example.com,因此将cookie设置为 .example.com。 AngularJS第一次看到Cookie并记住它时就没有问题。 AngularJS保留所有cookie的副本,当您通过AngularJS更新任何cookie时,实际上是在修改副本。之后,AngularJS遍历所有cookie,将其与copy进行比较,以确定并更新AngularJS更新了哪些cookie。

    InvocaJS反复更改 invoca_session的值。当AngularJS循环但所有cookie和 invoca_session与AngularJS的值不匹配时,它认为该值已被AngularJS更改(如上所述),并更新 invoca_session的值,用旧值替换新值。 (我对其进行了测试,这正是AngularJS v1.2.19的工作方式)

    问题是Angular v1.2.19在设置Cookie时未指定任何域(先前被预测为错误概率2)。因此,将创建一个域设置为 example.com的新cookie。然后,当InvocaJS尝试读取cookie时,它将读取为 example.com设置的旧cookie。

    AngularJS更改cookie

    Dev-tools Debugger

    Dev-Tools Debugger 2

    关于javascript - Cookie欺骗到没有点前缀的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185610/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com