谷歌分析的非法cookie导致Python后端崩溃

14 投票
2 回答
1483 浏览
提问于 2025-04-17 07:01

在我发布到Feedburner的内容中,跟踪设置里的活动名称包含了俄文字符,代码是Feed: ${feedUri} ${feedName}。问题是,这导致Google Analytics设置了一个错误的__utmz cookie,而我的后端(使用web.py)无法处理这个错误的cookie。

  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模块有问题,或者是浏览器的bug导致了错误的cookie被接受。这些问题可能会被恶意利用,因为有很多使用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%D0%B4%D0%B0%29

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

这个非法的cookie是在第一次访问页面时由Analytics的JavaScript设置的,之后的请求就会出现服务器错误。

2 个回答

1

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

无论如何,有一些方法可以避免这些问题。一个方法是在发送之前先把你的cookie字符串进行Base64编码,这样西里尔字母就能安全地隐藏起来。

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

5

我知道这可能不是你想要的答案,但解决这个问题的最好办法就是把 ga.js 升级到 analytics.js。analytics.js 是谷歌分析的最新版本,它是 通用分析 的一部分。analytics.js 只会写一个 cookie,这样就完全避免了这个问题。

这个问题比较棘手,因为它已经存在很长时间了,很多使用谷歌分析的用户已经有了自己的解决办法。如果现在去修复这个问题,会导致很多网站出现问题,所以我觉得谷歌不太可能会对此做什么,尤其是因为 analytics.js 已经解决了这个问题,而 ga.js 很快就会被淘汰

再次强调,我知道这不是你想要的答案,但我想说的是,自己去实现任何解决办法很可能会浪费很多时间。反正你迟早都得升级,到时候你的解决办法就没必要了。

这里还有一些关于 analytics.js 如何使用 cookies 的更多信息: https://developers.google.com/analytics/devguides/collection/analyticsjs/domains

撰写回答