当前位置: 首页 > 面试题库 >

从域提供服务时,会话cookie为什么起作用,而使用IP时却不能起作用?

孔乐邦
2023-03-14
问题内容

我有一个Flask应用程序,其会话在我的本地开发计算机上运行良好。但是,当我尝试将其部署在Amazon服务器上时,会话似乎无法正常工作。

更具体地说,未设置会话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)

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

会议 似乎工作在Firefox,而不是浏览器。

下面的小型应用程序演示了该问题,其底部的配置有所不同:

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
描述了cookie的处理方式,似乎表明cookie域必须是具有TLD(.com,.net等)的FQDN或完全匹配的IP地址。在原来的Netscape的cookie规范完全不提的IP地址。

Chrome开发人员决定比其他浏览器更严格地接受Cookie域的值。尽管他们一度纠正了一个阻止IP地址上的cookie的错误,但此后他们显然已经退后,并且不允许非FQDN域(包括本地主机)
IP地址上的cookie 。他们说他们 不会 解决此问题,因为他们不认为这是一个错误。

“正常” Cookie有效但会话Cookie无效的原因是,您没有为“正常”
Cookie设置域(这是一个可选参数),但是Flask自动将会话Cookie的域设置为SERVER_NAME。Chrome(和其他浏览器)接受不带域的Cookie,并将其自动设置为响应域,因此观察到了行为上的差异。如果将域设置为IP地址,则可以观察到正常的Cookie失败。

在开发过程中,您可以通过在本地主机上运行该应用程序来解决此问题,而不是将其默认设置为127.0.0.1。Flask有一个解决方法,如果服务器名称是localhost,则不会发送会话cookie的域。
app.run('localhost')

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

Chrome不允许该域具有IP地址的Cookie,并且没有实际的解决方法。



 类似资料:
  • 我正在开发一个vaadin web应用程序,我在web.xml中添加了以下代码片段。 现在我注意到,也在30分钟后,我的用户能够使用应用程序,我不想这样。我在vaadin的书上读到了一些关于这个问题的东西,但我并不了解一些东西。 在web.xml中: 会话超时应长于心跳间隔,否则会话在心跳保持活动之前就已关闭。由于会话过期使UI处于假定会话仍然存在的状态,这将在浏览器中导致不同步错误通知。 但是,

  • 我在div上使用了,它可以正常工作,但是当我在其他输入上使用时,div上的停止工作。 工作代码[单击时调用附加项(项目)] 破损的代码[addItem(项目)未被调用] 相关JS代码 这里是http://plnkr.co/edit/eI5dvczO2E1Cp1SBPgQx?p=preview点击输入将带来下拉。在一种情况下,单击下拉菜单会将项目添加到选定列表中,但在其他情况下不会。 我已经试过调试

  • 我正在尝试使用gradle运行Android版本。只要我不缩小,它就可以正常工作。当我启用minify(minifyEnabled true)时,构建总是失败,因为“无法为proguard.gradle.ProGuardTask生成代理类”。 gradle文件中我使用mini fy的部分: 只是需要一些帮助知道去哪里找...谢谢。 完整堆栈跟踪

  • 所以我有了这个网格: 在中有一个没有空格的超长字符串。是具有固定尺寸的占位符。这就产生了上述结果: 但将更改为会得到以下结果: 它会溢出其父级和屏幕大小。为什么它的行为不像Minmax? 码本

  • 通过选择,,和,我创建了一个全新的Spring初始化项目。 我做了一个小项目: 我试着将三个人保存到数据库中。保存方法只返回需要执行的Mono。如果我尝试通过简单的订阅来执行它,一切都很好: 但是,当我使用而不是时,应用程序挂起: 如果我手动查询数据库,我会看到Jim已被保存,但Jack和John未被保存。 这是窃听器,还是我做错了什么?我希望在代码进一步发展之前保证用户在数据库中,所以我真的很想

  • 拿我正在试验的这个非常简单的框架来说(这样我就可以更深入地学习JavaScript的函数原型。) 这工作很棒。控制台的输出是: 对象{ui:对象,操作:"单击设置openSidebar",函数:对象,运行:函数} 但是,当我尝试这样做时: 在openSidebar()中的的上下文是openSidebar(又名bind没有效果)。控制台输出: 对象{openSidebar:function} 但是,