【问题标题】:Google analytics illegal cookie breaks Python backend谷歌分析非法 cookie 破坏了 Python 后端
【发布时间】:2012-01-05 22:37:21
【问题描述】:

在我发布到 feedburner 的提要中,我在跟踪设置 Feed: ${feedUri} ${feedName} 中的广告系列名称中有俄语字符。问题是它导致 Google Analytics 设置的 __utmz cookie 不正确,并且无法由我的后端(即 web.py)处理。

  File "/home/dw0rm/lib/ve/lib/python2.7/site-packages/web/session.py", line 96, in _load
    self.session_id = web.cookies().get(cookie_name)
  File "/home/dw0rm/lib/ve/lib/python2.7/site-packages/web/webapi.py", line 359, in cookies
    cookie.load(ctx.env.get('HTTP_COOKIE', ''))
  File "/usr/local/lib/python2.7/Cookie.py", line 627, in load
    self.__ParseString(rawdata)
  File "/usr/local/lib/python2.7/Cookie.py", line 660, in __ParseString
    self.__set(K, rval, cval)
  File "/usr/local/lib/python2.7/Cookie.py", line 580, in __set
    M.set(key, real_value, coded_value)
  File "/usr/local/lib/python2.7/Cookie.py", line 455, in set
    raise CookieError("Illegal key value: %s" % key)
CookieError: Illegal key value: )|utmcmd

这个错误发生在 Firefox 中,我已经设法用这段代码修复它:

def myinternalerror():
    try:
        web.cookies()
    except CookieError:
        if not "cookie_err" in web.input():
            web.setcookie("__utmz", None, domain=web.ctx.host)
            raise web.seeother(web.changequery(cookie_err=1))
    return web.internalerror(render.site.e500())
app.internalerror = myinternalerror

但今天我什至在 Chrome 中也得到了这个“cookie_err=1”重定向。我在其他一些基于 web.py 和 Analytics 的网站上尝试过这个,它们都引发了内部服务器错误。并且这个错误一直持续到非法cookie被删除,这是普通访问者很难做到的事情。

我想知道我应该考虑哪些其他选项。也许 Python Cookie 模块不正确,或者是浏览器的错误导致了不正确的 cookie。这东西可以被用于恶意目的,因为有很多 Python 网站使用 Google Analytics 和 Cookie 模块。

这是跟踪查询:utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+cafenovru+%28%D0%9E%D0%BF%D0%B8%D1%81%D1%8C+%D1%82%D1%80%D0%B0%D0%BF%D0%B5%D0%B7%D0%BD%D1%8B%D1%85+%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B3%D0%BE+%D0%9D%D0%BE%D0%B2%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0%29

不正确的 __utmz cookie 值为 37098290.1322168259.5.3.utmcsr=feedburner|utmccn=Feed:%20cafenovru%20(Опись%20трапезных%20Великого%20Новгорода)|utmcmd=twitter

Analytics javascript 在第一次访问页面时设置了非法 cookie,并且在后续请求中出现服务器端错误。

【问题讨论】:

  • 问题是Cookie坏了(这个cookie是合法的),但是除了修复Cookie之外没有真正的解决办法。
  • 所以应该修复的是 Python 模块?
  • 是的,Cookie 模块需要增强以支持更现代的 RFC。
  • 是否有一个符合 Cookie 的模块可以解决这个问题?

标签: javascript python cookies google-analytics web.py


【解决方案1】:

我知道这可能不是您要寻找的答案,但解决此错误的最佳方法是从 ga.js 升级到 analytics.js。 Analytics.js 是 Google Analytics 网络跟踪库的最新版本,是 universal analytics 的一部分。 Analytics.js 只写入一个 cookie,因此完全避免了这个问题。

这个错误的棘手问题是它已经存在了很长时间,而且许多 GA 用户都有现成的解决方法。现在修复它会破坏很多这样的网站,所以我认为谷歌不太可能对此采取任何措施,特别是因为 analytics.js 已经修复了这个问题,而且 ga.js will soon be deprecated

再一次,我知道这不是您要寻找的答案,但我只想重申,自己实施任何解决此问题的方法很可能会浪费大量时间。无论如何,你必须尽快升级,然后你的解决方法就没有必要了。

以下是有关 analytics.js 如何使用 cookie 的更多信息: https://developers.google.com/analytics/devguides/collection/analyticsjs/domains

【讨论】:

  • 我可能应该更具体,我不完全确定有问题的 cookie 是否来自 Analytics。另外-我想一劳永逸地解决问题-不是在我已经升级到analytics.js的GA的特定情况下
  • @julkiewicz 我不清楚你在寻找什么,因为 webpy 现在有自己的逻辑来解决 python 默认 cookie 解析中的这个问题。 github.com/webpy/webpy/issues/148
  • @lossleader 我使用 Pyramid,显然单个无效 cookie(由第三方设置)可能会导致应用程序异常。我正在寻找解决方法。
  • @julkiewicz 看着 pylons 的 webob/cookies.py 项目(金字塔使用)它重新创建了解析,很大程度上实现了与默认解析器相同的错误。所以它确实是一个单独的(尽管可能是剪切和粘贴的)错误。
  • @lossleader 有没有办法将默认的 cookie 模块切换为其他东西,或者是自己修补它的唯一选择?如果我知道如何做到这一点,我完全愿意修补它(我正在使用 virtualenv)。
【解决方案2】:

这听起来像是 UTF-8 编码问题。或者更糟的是,您可能使用的是 KOI8-R 或 Windows 1251。

无论如何,有一些方法可以避免问题。一种方法是在发送之前对您的 cookie 字符串进行 Base64 编码,这样西里尔字符就会被安全隐藏。

但是看看你的代码。如果您在写出之前没有对 cookie 字符串进行 UTF-8 编码,那也可能会解决问题。当我查看字符串时,它似乎是成对的代码,第一个代码总是 D0 或 D1。这表明您在使用 16 位 Unicode 字符编译的 Python 上使用原始 Unicode,或者对字符串使用 UCS-2 编码而不是 UTF-8。

【讨论】:

  • 我没有设置这个 cookie,它是由浏览器中的 Google Analytics JavaScript 完成的。
猜你喜欢
  • 2023-03-16
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多