谷歌分析非法 cookie 破坏 Python 后端

14

在我发布到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的bug。 这些东西可能被用于恶意目的,因为有许多使用Google Analytics和Cookie模块的Python网站。

这是跟踪查询: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 之外,实际上没有其他解决方案。 - Nick Bastin
那么需要修复的是Python模块吗? - Andrey Kuzmin
2
是的,Cookie模块需要增强以支持更现代的RFC。 - Nick Bastin
有符合Cookie标准的模块可以解决这个问题吗? - Andrey Kuzmin
2个回答

5
我知道这可能不是你想要的答案,但解决这个错误最好的方法就是从ga.js升级到analytics.js。Analytics.js是Google Analytics网站跟踪库的最新版本,是通用分析的一部分。Analytics.js只写入一个Cookie,因此完全避免了这个问题。
这个错误的棘手之处在于它已经存在很长时间了,并且许多GA用户已经有了现有的解决方法。现在修复它将会破坏很多这些网站,所以我认为Google不太可能会采取任何行动,特别是因为analytics.js已经解决了这个问题,而ga.js 很快将被弃用
再次强调,我知道这不是你想要的答案,但我只是想重申,自己实施任何解决此问题的解决方法很可能是浪费大量时间。你很快就必须进行升级,然后你的解决方法将变得不必要。
这是关于analytics.js如何使用cookies的更多信息: https://developers.google.com/analytics/devguides/collection/analyticsjs/domains

@julkiewicz,我不太清楚你想要什么,因为webpy现在已经有了自己的逻辑来解决Python默认cookie解析的问题。https://github.com/webpy/webpy/issues/148 - lossleader
@julkiewicz 看了看 Pylons 的 WebOb/Cookies.py 项目(Pyramid 使用的),它重新创建了解析,基本上实现了与默认解析器相同的错误。因此,这实际上是一个单独的(尽管可能是剪切和粘贴的)错误。 - lossleader
@lossleader 有没有办法将默认的cookie模块切换为其他东西,或者唯一的选择是自己修补它?如果我知道如何做到这一点(我正在使用virtualenv),我完全愿意修补它。 - julx
@julkiewicz 对于Pyramid,我认为您需要在此处提交错误文件、堆栈跟踪和示例cookie:https://github.com/Pylons/webob/issues - lossleader
我很久以前就问过这个问题了。自那时起,我已经在使用新的跟踪库。但还是谢谢你的提示,现在我可以删除绕过代码了。 - Andrey Kuzmin
显示剩余2条评论

1

这似乎是一个UTF-8编码问题。或者更糟糕的是,您可能正在使用KOI8-R或Windows 1251。

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

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


我没有设置这个cookie,而是由Google Analytics JavaScript在浏览器中完成的。 - Andrey Kuzmin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接