【问题标题】:ValueError: Unsafe header valueValueError:不安全的标头值
【发布时间】:2017-07-12 03:06:30
【问题描述】:

我使用 Tornado 4.2 开发了一个相当大的 Web 应用程序。我的应用程序的一个处理程序负责通过发布请求验证用户的登录详细信息。

特别是在这个处理程序中,我使用带有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)

设置 cookie 后,我使用 Tornado 的 redirect 将用户发送到另一个 URL。

self.redirect("/"+lang+"/base_fx.html")

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

       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

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

【问题讨论】:

    标签: python post http-headers tornado


    【解决方案1】:

    查看corresponding source code 有两个选择:

    1. 您的 cookie 值中有一个无效字符。这只能在用户名中,因为set_secure_cookie 方法正确地将它的给定值转义为base64。请确保您的用户名不包含 invalid characters ([\x00-\x1f]) 或 - 更好的是 - 也为用户名使用安全 cookie。

    2. 在我看来,发生这种情况的更可能的原因是您的权限对象太大而无法将其放入 cookie。 Tornado 将 cookie 值的长度限制为 4000(请参阅source)。使用安全 cookie 时,需要容纳的信息多于您的数据,而且您的数据被编码为 base64,这使得它更大。由于许多原因(例如,它随每个请求一起发送,......),将如此大的信息存储为 cookie 可能不是一个好主意。您应该将该数据保存在服务器端,或者使用与 cookie 不同的本地存储技术。

    【讨论】:

    • 谢谢@Georg!所以问题是我没有检查我安装的版本的来源,而是最新的。感谢您为我指出正确的方向,我已投票并发布了解决方案:)
    【解决方案2】:

    Georg Jung 的帖子为我指明了正确的方向。我遇到的问题,ValueError: Unsafe header value,与两个现有提出的问题有关:14731025 现在已在 4.3 版本的 Tornado 上解决。对我来说,问题是某些用户名比其他用户名更长,导致这些用户名的标头大小大于 4000。

    因此,要正确解决此问题,您可以采取以下两种操作之一:

    1. 将 Tornado 更新到等于或高于 4.3 的版本。
    2. 或者如果您不想升级它,您可以将标头大小的限制增加到 8000 或更大。您可以通过更改系统中已安装的 Tornado 发行版中的文件 web.py 来做到这一点。

    例如在 Debian 系统上,路径是:

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

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2013-07-24
      • 2021-01-13
      相关资源
      最近更新 更多