为什么会话 cookie 在从域提供服务时有效,但在使用 IP 时却无效?

2024-04-21

我有一个 Flask 应用程序,其中的会话在我的本地开发计算机上运行良好。但是,当我尝试将其部署在亚马逊服务器上时,会话似乎不起作用。

更具体地说,未设置会话cookie。不过,我可以设置普通的 cookie。我确保我有一个静态安全密钥,正如其他人指出的那样,这可能是一个问题。唯一的区别在于服务器的设置方式。在开发过程中,我使用

app.run()

在本地运行。部署时,我使用

app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
app.run(host='0.0.0.0', port=80)

我怀疑问题可能出在上面,但不完全确定。

会议does似乎可以在 Firefox 上使用,但不能在 Chrome 上使用。

以下小应用程序演示了该问题,配置差异位于底部:

from flask import Flask, make_response, request, session

app = Flask(__name__)
app.secret_key = 'secretKey'

# this is to verify that cookies can be set
@app.route('/setcookie')
def set_cookie():
    response = make_response('Cookie set')
    response.set_cookie('cookie name', 'cookie value')
    return response

@app.route('/getcookie')
def get_cookie():
    if 'cookie name' in request.cookies:
        return 'Cookie found. Its value is %s.' % request.cookies['cookie name']
    else:
       return 'Cookie not found'

# this is to check if sessions work
@app.route('/setsession')
def set_session():
    session['session name'] = 'session value'
    return 'Session set'

@app.route('/getsession')
def get_session():
    if 'session name' in session:
        return 'Session value is %s.' % session['session name']
    else:
        return 'Session value not found'

if __name__ == '__main__':
    app.debug = True

    # windows, local development
    #app.run()  

    # Ubuntu
    app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
    app.run(host='0.0.0.0', port=80)

这是 Chrome 中的一个“错误”,而不是您的应用程序的问题。 (如果其他浏览器更改策略,也可能会影响它们。)

RFC 2109 https://www.rfc-editor.org/rfc/rfc2109#section-4.3.2描述了 cookie 的处理方式,似乎表明 cookie 域必须是带有 TLD(.com、.net 等)的 FQDN,或者是完全匹配的 IP 地址。这原始 Netscape cookie 规范 https://web.archive.org/web/20010322201006/http://www.netscape.com/newsref/std/cookie_spec.html根本没有提到IP地址。

Chrome 开发人员决定比其他浏览器更加严格地规定他们接受的 cookie 域值。虽然在某一时刻他们纠正了一个错误 https://code.google.com/p/chromium/issues/detail?id=3699阻止 IP 地址上的 cookie,他们显然已经倒退了 https://code.google.com/p/chromium/issues/detail?id=56211从那时起,不允许在非 FQDN 域(包括本地主机)上使用 cookieorIP 地址。他们已经表示他们will not解决这个问题,因为他们不认为这是一个错误。

“普通”cookie 起作用但会话 cookie 不起作用的原因是,您没有为“普通”cookie 设置域(它是一个可选参数),但 Flask 会自动将会话 cookie 的域设置为SERVER_NAME。 Chrome(和其他浏览器)接受没有域的 cookie 并自动将它们设置为响应的域,因此观察到行为差异。如果您将域设置为 IP 地址,您可以观察到正常的 cookie 失败。

在开发过程中,您可以通过在本地主机上运行应用程序来解决此问题,而不是让它默认为 127.0.0.1。Flask 有一个解决方法 https://github.com/mitsuhiko/flask/blob/master/flask/sessions.py#L211-L215如果服务器名称是 localhost,则不会发送会话 cookie 的域。app.run('localhost')

在生产中,没有任何真正的解决方案。您可以在域而不是 IP 上提供此服务,这可以解决该问题,但在您的环境中可能无法实现。您可以要求所有客户都使用除 Chrome 之外的其他产品,但这是不切实际的。或者,您可以为 Flask 提供不同的会话接口,对已用于 localhost 的 IP 执行相同的解决方法,尽管这在某种程度上可能不安全。

Chrome 不允许带有域 IP 的 cookie,并且没有实际的解决方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么会话 cookie 在从域提供服务时有效,但在使用 IP 时却无效? 的相关文章

  • GUI 测试工具 PyUseCase 与 Dogtail 相比如何?

    GUI测试工具如何Py用例 http pypi python org pypi PyUseCase重命名为故事文本 http pypi python org pypi StoryText 相比于Dogtail http en wikiped
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • pyCUDA无法打印结果

    最近 我使用 pip 为我的 python3 4 3 安装 pyCUDA 但我在测试示例代码时发现 https documen tician de pycuda tutorial html getting started https doc
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 使用 Tkinter 打开网页

    因此 我的应用程序需要能够打开其中的单个网页 并且它必须来自互联网并且未保存 特别是我想使用 Tkinter GUI 工具包 因为它是我最熟悉的工具包 最重要的是 我希望能够在窗口中生成事件 例如单击鼠标 但无需实际使用鼠标 有什么好的方法
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • 哪种方式最适合Python工厂注册?

    这是一个关于这些方法中哪一种被认为是最有效的问题 Pythonic 我不是在寻找个人意见 而是在寻找惯用的观点 我的背景不是Python 所以这会对我有帮助 我正在开发一个可扩展的 Python 3 项目 这个想法类似于工厂模式 只不过它是
  • Python脚本从字母和两个字母组合生成单词

    我正在编写一个简短的脚本 它允许我使用我设置的参数生成所有可能的字母组合 例如 b a 参数 单词 5 个字母 第三 第五个字母 b a 第一个字母 ph sd nn mm 或 gh 第二 第四个字母 任意元音 aeiouy 和 rc 换句
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • 如何有效地比较 pandas DataFrame 中的行?

    我有一个 pandas 数据框 其中包含雷击记录以及时间戳和全球位置 格式如下 Index Date Time Lat Lon Good fix 0 1 20160101 00 00 00 9962692 7 1961 60 7604 1
  • Tkinter 将鼠标点击绑定到框架

    我一定错过了一些明显的东西 我的 Tkinter 程序中有两个框架 每个框架在网格布局中都有一堆标签 我想将鼠标点击绑定到其中一个而不是另一个 我目前使用 root bind

随机推荐