2011-08-22 18 views
6

私は内部でcookie.SimpleCookieクラスを使用してユーザーのブラウザから受信したCookieを読み込みます。web.pyを使用します。CookieError:不正なキー値

時折、私のような例外が出ます:

... 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/Cookie.py", line 455, in set 
    raise CookieError("Illegal key value: %s" % key) 
CookieError: Illegal key value: SinaRot/g/news.sina.com.cn 

を問題の文字はRFC 2109(クッキー)の私の読書によるとこれは、スラッシュ(/)のようだとRFC 2068(HTTP 1.1)でなければなりません許可されていないので、OKです。

私はこのクッキーを設定しません。私のドメイン(プロキシはおそらく?)になぜ、どのように設定されているのか分かりませんが、それは無関係です。より大きな問題は、このクッキーに遭遇したときにシンプルクッキーが難しいと失敗し、ユーザーにエラーを返すことです。

私の質問は:SimpleCookieに無効なクッキーを無視してもらう方法はありますか?私はこれを行うためにドキュメントで明らかな何かを見つけることができませんでした。

+0

CookieError例外を検出できませんか? – GWW

+0

私は(そしてすべきですが)例外であるため、私たちのセッションクッキーを含む他のクッキーにアクセスすることはできません。その後のリクエストには、エラーの原因となったCookieと同じCookieが含まれます。さらに、それがプロキシから来ている場合、プロキシが次回にそれを再設定するので、それを設定解除しようとすると無駄になる可能性があります。 – dcrosta

答えて

0

私のwebpyアプリは、FirefoxブラウザでGoogle Analyticsによって設定されたCookieError: Illegal key value:)|utmcmdを経験しました。それを修正するために、正しい値を設定しようとするリダイレクトを発行します。

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()) 

if not web.config.debug: 
    app.internalerror = myinternalerror 
+0

残念ながら、これは私のためには機能しません。なぜなら、名前が不正なクッキーを設定しようとすると、依然としてクッキーエラーがスローされるからです。これは順番にクッキーを削除しないので、問題は次回に戻ってきます。 – dcrosta

+0

クッキーの名前または値に不正な文字が含まれていますか?私の場合は値ですので、正しい値でリセットして同じURLにリダイレクトします。不正なCookieが修正されます。 –

+0

フォワードスラッシュは違法だと思います。私がこのクッキーを挿入したすべてのブラウザはうまく動作しますが、 'Cookie'モジュールはブラウザよりも賢明であるようです。 – dcrosta

3

これは私に役立ちます。

def get_cookies(): 
    import Cookie 
    ans = Cookie.SimpleCookie() 
    for bit in os.environ.get('HTTP_COOKIE', '').split('; '): 
     try: 
      ans.load(bit) 
     except Cookie.CookieError: 
      pass 
    return ans