2017-02-22 80 views
0

我开发了一个使用Tornado 4.2的相当大的Web应用程序。我的应用程序的其中一个处理程序负责通过发布请求验证用户的登录详细信息。ValueError:不安全的标头值

set_secure_cookie特别是在此处理我用签字cookie来识别登录的用户及其权限,使用下面的代码:

self.set_cookie("user", self.get_argument("username"), domain=".my-domain.com", expires_days=None, httpOnly=True) 
self.set_secure_cookie("access", str(data['permissions']), expires_days=None, httpOnly=True) 

设置我用旋风的redirect饼干后给用户发送到另一个URL。

在大多数情况下,它按预期工作,没有任何问题。但是,对于某些用户,我收到以下错误。

 self.redirect("/"+lang+"/base_fx.html") 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 671, in redirect 
     self.finish() 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 934, in finish 
     self.flush(include_footers=True) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 884, in flush 
     self.add_header("Set-Cookie", cookie.OutputString(None)) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 339, in add_header 
     self._headers.add(name, self._convert_header_value(value)) 
File "/usr/lib/python2.7/dist-packages/tornado/web.py", line 369, in 
    _convert_header_value 
     raise ValueError("Unsafe header value %r", value) 
ValueError: ('Unsafe header value %r', 'access="2|1:0|10:1485161516|6:access|3892:eydvd…<long string>..f0a2f8ad"; httponly; Path=/') 
ERROR:tornado.general:Cannot send error response after headers written 

有没有人遇到类似的问题?

回答

0

Georg Jung的帖子指出了我的正确方向。问题,ValueError:不安全的标头值,我面对的是两个现有的问题:14731025,现已在4.3版本的Tornado上解决。对我来说,问题是,一些用户名比其他一些导致头部大小这些用户名必须大于4000

因此,要妥善解决这个问题,你可以采取以下两个动作之一更长:

  1. 将您的龙卷风更新为等于或大于4.3的版本。
  2. 或者,如果您不想升级它,可以将标题大小的限制增加到8000或更多。您可以通过在系统中安装的Tornado版本中更改文件web.py来实现。

例如Debian系统上的路径是:

usr/lib/python3.2/dist-packages/tornado/web.py 
1

望着corresponding source code给出了两种选择:

  1. 。在你的cookie值无效字符。这只能在用户名中,因为set_secure_cookie方法正确地将其赋值为base64。请确保您的用户名不包含invalid characters[\x00-\x1f])或更好 - 为用户名也使用安全cookie。

  2. 在我看来,这种情况发生的可能性更大的原因是你的权限对象对于把它放入cookie中是很大的。龙卷风将cookie值限制为4000(请参阅source)。当使用安全的cookie时,您的数据比需要适合的数据更多,而且您的数据编码为base64,这使得它更大。存储诸如cookie这样的大信息可能不是一个好主意,原因很多(即,它随每个请求发送,...)。您应该保存数据服务器端或使用不同于cookies的本地存储技术。

+0

感谢@Georg!所以问题是,我没有检查我的安装版本的来源,但最新的。感谢您指点我正确的方向,我已经投票并发布了解决方案:) – afxentios