Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:不安全的标头值_Python_Post_Http Headers_Tornado - Fatal编程技术网

Python ValueError:不安全的标头值

Python ValueError:不安全的标头值,python,post,http-headers,tornado,Python,Post,Http Headers,Tornado,我使用Tornado4.2开发了一个相当大的web应用程序。我的应用程序的一个处理程序负责通过post请求验证用户的登录详细信息 具体地说,在这个处理程序中,我使用已签名的Cookie来识别已登录的用户及其权限,使用以下代码: self.set_cookie("user", self.get_argument("username"), domain=".my-domain.com", expires_days=None, httpOnly=True) self.set_secure_cooki

我使用Tornado4.2开发了一个相当大的web应用程序。我的应用程序的一个处理程序负责通过post请求验证用户的登录详细信息

具体地说,在这个处理程序中,我使用已签名的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)
设置cookies后,我使用Tornado将用户发送到另一个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
self.redirect(“/”+lang+“/base\u fx.html”)
文件“/usr/lib/python2.7/dist packages/tornado/web.py”,第671行,在重定向中
self.finish()
文件“/usr/lib/python2.7/dist-packages/tornado/web.py”,第934行,完成
self.flush(include_footers=True)
文件“/usr/lib/python2.7/dist-packages/tornado/web.py”,第884行,齐平
self.add_头(“Set Cookie”,Cookie.OutputString(None))
文件“/usr/lib/python2.7/dist packages/tornado/web.py”,第339行,在add_标题中
self.\u headers.add(名称、self.\u转换\u header\u值(值))
文件“/usr/lib/python2.7/dist-packages/tornado/web.py”,第369行,在
_转换\u头\u值
raise VALUERROR(“不安全的标题值%r”,值)
ValueError:('Unsafe header value%r','access=“2 | 1:0 | 10:1485161516 | 6:access | 3892:eydvd…”f0a2f8ad“httponly;Path=/”)
错误:tornado。常规:写入标题后无法发送错误响应
有没有人遇到过类似的问题?

查看以下两个选项:

  • cookie值中存在无效字符。这只能在用户名中,因为
    set\u secure\u cookie
    方法正确地将其给定值转义为base64。请确保您的用户名不包含(
    [\x00-\x1f]
    )或-更好-对用户名使用安全cookie

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


  • Georg Jung post为我指出了正确的方向。我所面临的ValueError:Unsafe header value问题与两个现有的问题有关:这两个问题现在已经在Tornado版本上得到了解决。对我来说,问题是一些用户名比其他用户名长,导致这些用户名的标题大小大于4000

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

  • 将Tornado更新为等于或大于4.3的版本
  • 或者,如果您不想升级它,您可以将标头大小的限制增加到8000或更多。您可以通过更改系统中已安装的Tornado发行版中的文件web.py来实现这一点
  • 例如,在Debian系统上,路径为:

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

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