【问题标题】:How to set session cookies with `__Host-` prefix in Electron?如何在 Electron 中使用 `__Host-` 前缀设置会话 cookie?
【发布时间】:2021-11-30 21:50:32
【问题描述】:

我正在尝试以无头模式运行 Electron 以获取远程服务器上的内容,这需要带有前缀 __Host- 的 cookie。但是,旧代码用于运行

    var cookie = {
            url: cookieurl,
            name: cookiename,
            value: cookievalue
    };
    win.webContents.session.cookies.set(cookie)
    .then(function(result)
    {
        loadUrl(win, indexUrl, output);
    })
    .catch(function(e)
    {
        throw Error("Failed to load cookie, e="+e);
    });

只要cookiename 不以__Host- 开头,这似乎就可以正常工作。当我尝试使用前缀 __Host- 设置 cookie 时,我得到以下异常:

Error: Failed to parse cookie

但是,https://www.electronjs.org/docs/latest/api/cookies 没有记录此限制

【问题讨论】:

标签: javascript security cookies electron


【解决方案1】:

https://www.electronjs.org/docs/latest/api/cookies 的官方文档中没有记录此细节,但它是其他规则的逻辑结果。具体而言,Set-Cookie HTTP header 被定义为遵循以下规则:

<cookie-name>=<cookie-value>
...
注意:有些<cookie-name> 有一个 具体语义:

__Host- 前缀:
饼干 以__Host- 开头的名称必须使用secure 标志设置,必须 来自安全页面 (HTTPS),不得指定 domain(并且 因此,不会发送到子域),并且路径必须是/
...
属性
...
Secure 可选
表示cookie只发送到服务器 当使用https: 方案发出请求时(localhost 除外), 因此,更能抵抗中间人攻击。

注意:不要假设Secure 会阻止对敏感信息的所有访问 cookie 中的信息(会话密钥、登录详细信息等)。饼干 仍然可以读取/修改具有此属性的访问权限 如果 HttpOnly cookie 来自客户端的硬盘或来自 JavaScript 属性未设置。

不安全的站点 (http:) 无法使用 Secure 属性设置 cookie (从 Chrome 52 和 Firefox 52 开始)。对于 Firefox,https: 要求 当 localhost 设置 Secure 属性时会被忽略(因为 火狐 75)。

具体来说,如果没有指定secure,则不能设置名称以__Host- 开头的cookie。结果,按照问题中的描述设置 cookie 失败。不幸的是,例外只是Error: Failed to parse cookie 而不是Error: cannot set cookie with "__Host-" prefix without also setting "secure" attribute

以下应该按预期工作:

    var cookie = {
            url: cookieurl,
            name: cookiename,
            value: cookievalue,
            secure: true,
            // httpOnly: true,
            // sameSite: "lax",
    };
    win.webContents.session.cookies.set(cookie)
    .then(function(result)
    {
        loadUrl(win, indexUrl, output);
    })
    .catch(function(e)
    {
        throw Error("Failed to load cookie, e="+e);
    });

上面的示例在 cmets 中还有 httpOnlysameSite 属性,以提醒您可能也需要考虑这些属性。

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 2020-05-24
    • 2021-11-03
    • 2018-07-30
    • 2023-02-02
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多