Python 无法识别请求中的 cookie header
Python not recognizing cookies in request header
在工作中,我们一直在开发一个 python 应用程序(特别是 django),它间歇性地表现得好像它没有识别请求中发送的某些 cookie。
问题并不总是发生,但一旦发生似乎会无限期地持续存在。有时可以通过清除 cookie 并重新加载页面来解决问题。
所有 cookie 都是有效的(尽管其中有相当多的第 3 方 cookie)并且在服务器和浏览器都支持的最大大小内。
解决方案
如果您的应用程序需要使用 "SimpleCookie"(被 Python 库和框架广泛使用)来解释 Python 中的 "Cookie" header,并且您的网站的域设置了不受您控制的 cookie,请避免出现问题 #22931 (https://bugs.python.org/issue22931) 的 Python 版本。
3.3.x、3.4.x、3.5.x、2.7.9.
等多个版本均存在该bug
详情
问题的诊断结果相当简单,但我想我应该使用更通用的语言在这里分享它,因为搜索问题没有产生任何有用的结果,直到它被缩小到特定的存在几个 cookie 中的有效 个字符。
在 Python 2.7.9(以及 3.x 的几个版本)中存在一个错误,其中在其值中带有“[”或“]”的 cookie 导致解析 "Cookie" header 静默失败。由于方括号是 cookie 值 (http://www.rfc-editor.org/rfc/rfc6265.txt) 的有效字符,并且在第 3 方库中常用,因此该问题可能不利于 Web 应用程序中的 cookie 驱动功能。
它特别难以捉摸,因为 cookie 解析的终止似乎仅在它尝试解析值中带有方括号的第一个 cookie 时才会发生。这意味着如果 cookie 碰巧以不同的顺序发送,则可能不会出现此问题。
例如
如果请求 header 的格式为 Cookie: important_cookie=foobar; bad_character=[
,那么 "important_cookie" 的值将在应用程序中可用——但如果请求 [=52] 则不会=] 曾经
Cookie: bad_character=[; important_cookie=foobar
.
一旦您知道是方括号导致了问题,就很容易找到 Python 中报告的潜在错误,但深入研究潜在问题可能会很麻烦。
在工作中,我们一直在开发一个 python 应用程序(特别是 django),它间歇性地表现得好像它没有识别请求中发送的某些 cookie。
问题并不总是发生,但一旦发生似乎会无限期地持续存在。有时可以通过清除 cookie 并重新加载页面来解决问题。
所有 cookie 都是有效的(尽管其中有相当多的第 3 方 cookie)并且在服务器和浏览器都支持的最大大小内。
解决方案
如果您的应用程序需要使用 "SimpleCookie"(被 Python 库和框架广泛使用)来解释 Python 中的 "Cookie" header,并且您的网站的域设置了不受您控制的 cookie,请避免出现问题 #22931 (https://bugs.python.org/issue22931) 的 Python 版本。
3.3.x、3.4.x、3.5.x、2.7.9.
等多个版本均存在该bug详情
问题的诊断结果相当简单,但我想我应该使用更通用的语言在这里分享它,因为搜索问题没有产生任何有用的结果,直到它被缩小到特定的存在几个 cookie 中的有效 个字符。
在 Python 2.7.9(以及 3.x 的几个版本)中存在一个错误,其中在其值中带有“[”或“]”的 cookie 导致解析 "Cookie" header 静默失败。由于方括号是 cookie 值 (http://www.rfc-editor.org/rfc/rfc6265.txt) 的有效字符,并且在第 3 方库中常用,因此该问题可能不利于 Web 应用程序中的 cookie 驱动功能。
它特别难以捉摸,因为 cookie 解析的终止似乎仅在它尝试解析值中带有方括号的第一个 cookie 时才会发生。这意味着如果 cookie 碰巧以不同的顺序发送,则可能不会出现此问题。
例如
如果请求 header 的格式为 Cookie: important_cookie=foobar; bad_character=[
,那么 "important_cookie" 的值将在应用程序中可用——但如果请求 [=52] 则不会=] 曾经
Cookie: bad_character=[; important_cookie=foobar
.
一旦您知道是方括号导致了问题,就很容易找到 Python 中报告的潜在错误,但深入研究潜在问题可能会很麻烦。