【问题标题】:Twisted web server session matching/diagnosing扭曲的 Web 服务器会话匹配/诊断
【发布时间】:2019-11-02 05:22:42
【问题描述】:

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

最近我添加了一种新型设备,但我遇到了会话匹配无法正常工作的问题。

我正在使用来自 twisted.web.server Session 类的 getSession()。

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

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

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

Twisted 发送的 Set-Cookie 标头:

Set-Cookie: TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c; Path=/

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

Cookie: $Version="0"; TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c;$Path=/

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

Set-Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb; Path=/

和Twisted Session不匹配的结果Cookie头:

Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb/

只是将路径“/”放在 TWISTE_SESSION 属性的末尾。

我有点不知道如何进一步诊断,我试图重写 Cookie 标头并从末尾删除 / 但这没有帮助。

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

【问题讨论】:

    标签: python twisted twisted.web


    【解决方案1】:

    我已经想出了一个解决方法。我想在这里发布它以防万一它对其他人有用。

    简而言之,实际的答案是 HTTP 客户端已损坏并错误地发送 Cookie 标头。

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多