首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扭曲的web服务器会话匹配/诊断

扭曲的web服务器会话匹配/诊断
EN

Stack Overflow用户
提问于 2019-06-19 20:56:04
回答 1查看 65关注 0票数 0

我有一个使用Python Twisted的现有web应用程序。客户端是嵌入式设备,而不是人类。因此,我偶尔会遇到这些设备中经常过时和简单化的http客户端的怪癖。这个应用程序依赖于会话cookie,到目前为止我还没有遇到任何问题。

最近我添加了一种新的设备,我遇到了会话匹配不起作用的问题。

我使用的是twisted.web.server会话类中的getSession()。

这个特定的客户端设备似乎正在以getSession无法与会话匹配的格式返回Cookie头(因此在收到每个请求时都会创建一个新会话)。

我不确定这是Twisted的问题还是客户端设备如何格式化cookie报头的问题,特别是它如何重新格式化Path属性的问题。

工作的客户端设备的行为是这样的。

Twisted发送的Set-Cookie报头:

代码语言:javascript
复制
Set-Cookie: TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c; Path=/

以及客户端在下一次请求时发送的Cookie标头:

代码语言:javascript
复制
Cookie: $Version="0"; TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c;$Path=/

现在是非工作客户端,来自Twisted web服务器的Set-Cookie报头:

代码语言:javascript
复制
Set-Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb; Path=/

以及Twisted Session不匹配的Cookie标头:

代码语言:javascript
复制
Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb/

它只是将路径"/“放在TWISTED_SESSION属性的末尾。

我在如何进一步诊断这个问题上有点卡住了,我试图重写Cookie头并去掉结尾的/,但这没有帮助。

我也不确定客户的行为是否正确。这看起来很不寻常,但我不知道它所做的是否在技术上是错误的。

EN

回答 1

Stack Overflow用户

发布于 2019-06-21 16:58:49

我已经想出了解决这个问题的办法。我想把它贴在这里,以防对其他人有用。

简而言之,实际的答案是HTTP客户端中断了,并且错误地发送了Cookie头。

我很高兴有人能证明不是这样,但根据我自己对RFC6265的阅读& Mozilla开发人员文档,不允许将路径属性附加到另一个cookie (name=value)对的末尾。鉴于这两个名称是任意的,这就没有任何意义了。

我添加了一个monkeypatch来解决这个问题。它很乱,但它允许我进一步测试这个设备是否有一些用处:

代码语言:javascript
复制
from twisted.web.http import Request
def parseCookies(self):
    """                                                                                                                                     
    Parse cookie headers.                                                                                                                   

    This method is not intended for users.                                                                                                  
    """
    cookieheaders = self.requestHeaders.getRawHeaders(b"cookie")

    if cookieheaders is None:
    return

    for cookietxt in cookieheaders:
        if cookietxt:
            for cook in cookietxt.split(b';'):
        cook = cook.lstrip()
                try:
                    k, v = cook.split(b'=', 1)
                    self.received_cookies[k] = v.split(b'/')[0]
                except ValueError:
                    pass

Request.parseCookies = parseCookies
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56668187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档