如何在Flask响应上显式设置samesite=None

2024-10-01 07:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

由于7月份Chrome中出现了一些变化,我需要修改我的应用程序来显式地提供SameSite=None键值。这是因为RFC对缺少此设置的处理方式要比它存在但设置为“无”时更具影响。在

但是在set_cookie方法中,samesite参数默认为None,这会导致它不会写入set cookie。如何将其强制到响应的set cookie部分?在

尝试用下面的代码设置

resp.set_cookie('abcid', 'Hello', domain=request_data.domain, path='/', samesite=None, max_age=63072000) 

这不会在返回的集合cookie中显示任何SameSite详细信息

abcid=Hello; Domain=.localhost; Expires=Tue, 29-Jun-2021 22:34:02 GMT; Max-Age=63072000; Path=/

如果我尝试显式地设置Lax的值(这是每个rfc可接受的值之一),那么

^{pr2}$

我得到了set cookie,它显式地具有SameSite=Lax设置

abcid=Hello; Domain=.localhost; Expires=Tue, 29-Jun-2021 23:03:10 GMT; Max-Age=63072000; Path=/; SameSite=Lax

我没有尝试过“None”和“None”,但它们要么会导致应用程序崩溃,要么会在结果响应中忽略相同的站点。在

如有任何帮助,我们将不胜感激


Tags: none应用程序localhosthellocookiedomainjunexpires
2条回答

您还可以使用以下代码使用SameSite=None设置cookies,直到发布fix

from werkzeug.http import dump_cookie

# That's a workaround for explicitly setting SameSite to None
# Until the following fix is released: 
# https://github.com/pallets/werkzeug/issues/1549
def set_cookie(response, *args, **kwargs):
    cookie = dump_cookie(*args, **kwargs)

    if 'samesite' in kwargs and kwargs['samesite'] is None:
        cookie = "{}; {}".format(cookie, b'SameSite=None'.decode('latin1'))

    response.headers.add(
        'Set-Cookie',
        cookie
    )

一旦the fix to this issue是 释放后,您将能够使用 ^{} 像这样:

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def hello_world():
    resp = make_response('Hello, World!');
    resp.set_cookie('same-site-cookie', 'foo', samesite='Lax');
    resp.set_cookie('cross-site-cookie', 'bar', samesite='Lax', secure=True);
    return resp

在你等待释放的时候,你仍然可以 set the header 明确地:

^{pr2}$

相关问题 更多 >