Googleアナリティクスの不正なCookieがPythonバックエンドを壊す

FeedBurnerに公開されている私のフィードには、設定 Feed:$ {feedUri} $ {feedName} をトラッキングするキャンペーン名にロシア語の文字があります。問題は、Googleアナリティクスによって設定された不正な__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に基づいた他のいくつかのサイトでこれを試してみましたが、すべて内部的なサーバーエラーが発生します。そして、このエラーは、不正なクッキーが削除されるまで保持されます。これは、通常の訪問者が行うことが困難なことです。

私は他にどのような選択肢があるかを知りたい。たぶんPython Cookieモジュールが間違っているかもしれません。あるいは不正なクッキーを引き起こすブラウザのバグかもしれません。 GoogleアナリティクスとCookieモジュールを使用する多くのPythonウェブサイトが存在するため、このようなものは悪意のある目的に使用することができます。

This is tracking query: 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

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

不正なCookieはAnalyticsのjavascriptによって最初のページアクセス時に設定され、その後のリクエストではサーバー側のエラーが表示されます。

13
だから、修正するべきPythonモジュールですか?
追加された 著者 Andrey Kuzmin,
これを修正するCookie準拠のモジュールはありますか?
追加された 著者 Andrey Kuzmin,
問題は、Cookieが壊れていることです(このCookieは合法です)。実際にCookieを修正する以外の解決策はありません。
追加された 著者 Nick Bastin,
はい、Cookieモジュールは、より現代的なRFCをサポートするように拡張する必要があります。
追加された 著者 Nick Bastin,

2 答え

私はこれがおそらくあなたが探している答えではないことを知っていますが、このバグの最善の解決策は、 ga.js から analytics.js にアクセスしてください。 Analytics.jsは、Googleアナリティクスウェブトラッキングライブラリの最新バージョンで、ユニバーサルアナリティクスの一部です。 Analytics.jsは単一のCookieしか作成しないため、この問題は完全に回避されます。

このバグの扱いにくい問題は長い間存在しており、多くのGAユーザーには既存の回避策が用意されています。これを修正すると、これらのサイトが数多く破損する可能性があるため、Googleではこれについて何もしないだろうと考えています。特にanalytics.jsで既にこの問題が修正されており、ga.js は間もなく廃止される予定です

もう一度、私はこれがあなたが探している答えではないことを知っていますが、私はこの問題の解決方法を自分自身で実行することは、時間の無駄です。とにかくすぐにアップグレードする必要があり、回避策は不要になります。

Here's some more information on how analytics.js uses cookies: https://developers.google.com/analytics/devguides/collection/analyticsjs/domains

5
追加された
私はおそらくより具体的であったはずですが、問題のCookieがAnalyticsから来たものかどうかは完全にはわかりません。また、問題を一度に解決したいのですが、GAの特定のケースではなく、analytics.jsに既にアップグレードしています
追加された 著者 julkiewicz,
@lossleader私はPyramidを使用していますが、明らかに単一の無効なCookie(サードパーティによって設定された)がアプリケーション内で例外を引き起こす可能性があります。私はその周りの道を探しています。
追加された 著者 julkiewicz,
@lossleader何かのためにデフォルトのクッキーモジュールを切り替える方法はありますか、それとも自分自身でパッチを適用する唯一のオプションですか?もし私がそれをする方法を手がかりにしていれば、私は完全にそれを修正するつもりである(私はvirtualenvを使用している)。
追加された 著者 julkiewicz,
私はかなり前にこの質問をしました。それ以来、私はすでに新しい追跡ライブラリを使用しています。しかし、チップのおかげで、私は今回避策を行うコードを削除することがあります。
追加された 著者 Andrey Kuzmin,
@julkiewicz私はあなたが探しているものは不明です。なぜならWebpyはPythonのデフォルトのクッキー解析でこの問題を回避する独自のロジックを持っているからです。 github.com/webpy/webpy/issues/148
追加された 著者 lossleader,
@julkiewiczは、パイロンのwebob/cookies.pyプロジェクト(ピラミッドが使用する)を見て、デフォルトのパーサと同じミスを主に実装して構文解析を再作成しました。それは本当に別の(おそらくカット&ペーストされた)バグです。
追加された 著者 lossleader,
@julkiewicz Pyramidについては、スタックトレースとサンプルクッキーを添付してバグを報告したいと思います: github .com/Pylons/webob/issues
追加された 著者 lossleader,

これは、UTF-8エンコーディングの問題のような臭いです。あるいは、KOI8-RまたはWindows 1251を使用している可能性があります。

いずれにしても、問題を回避する方法があります。 1つの方法は、あなたがそれを送る前に、あなたのクッキー文字列をBase64でエンコードすることです。そうすれば、キリル文字は安全に隠されます。

しかし、あなたのコードを見てください。あなたがUTF-8を書き出す前にクッキー文字列をエンコードしていなければ、それも問題を解決するかもしれません。文字列を見ると、最初のコードが常にD0またはD1であるコードのペアのようです。これは、16ビットのUnicode文字でコンパイルされたPythonで生のUnicodeを使用していること、またはUTF-8ではなく文字列に対してUCS-2エンコーディングを使用していることを示しています。

1
追加された
私はこのクッキーを設定していません。これはブラウザのGoogleアナリティクスJavaScriptによって行われます。
追加された 著者 Andrey Kuzmin,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript