CookieError:非法键值

8 投票
3 回答
3636 浏览
提问于 2025-04-17 00:06

我在使用 web.py,这个框架内部会用到 cookie.SimpleCookie 这个类来处理从用户浏览器发来的 cookies。

有时候,我会遇到一些错误,比如:

...
  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(关于 cookies 的标准)和 RFC 2068(关于 HTTP 1.1 的标准)的理解,这个字符是被禁止的,所以这也没问题。

我并没有设置这个 cookie,也不太清楚它是怎么在我的域名下被设置的(可能是代理的问题?),但这并不重要;更大的问题是,当 simplecookie 遇到这个 cookie 时会崩溃,并给用户返回错误。

所以,我想问的是:有没有办法让 SimpleCookie 忽略那些无效的 cookies,而返回其他有效的 cookies?我在文档里找不到明显的解决办法。

3 个回答

0

我的webpy应用在Firefox浏览器中遇到了一个问题,错误信息是CookieError: Illegal key value: )|utmcmd,这个是Google Analytics设置的。为了解决这个问题,我尝试通过重定向来设置正确的值。

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
2

在设置 cookie 名称的时候,千万不要加空格。如果 cookie 名称里有空格,或者在 cookie 名称的引号里有空格,就会出现 CookieError: Illegal key value 这个错误。

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

撰写回答